Categories
android android-permissions java

Android permission doesn’t work even if I have declared it

186

I’m trying to write code to send an SMS from an Android app, but when I try to send the SMS it sends me back the error:

09-17 18:37:29.974  12847-12847/**.**.****E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: **.**.****, PID: 12847
java.lang.SecurityException: Sending SMS message: uid 10092 does not have android.permission.SEND_SMS.
        at android.os.Parcel.readException(Parcel.java:1599)
        at android.os.Parcel.readException(Parcel.java:1552)
        at com.android.internal.telephony.ISms$Stub$Proxy.sendTextForSubscriber(ISms.java:768)
        at android.telephony.SmsManager.sendTextMessageInternal(SmsManager.java:310)
        at android.telephony.SmsManager.sendTextMessage(SmsManager.java:293)
        at **.**.****.MainActivity$3.onClick(MainActivity.java:70)
        at android.view.View.performClick(View.java:5198)
        at android.view.View$PerformClick.run(View.java:21147)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

I checked but I have the permissions in the manifest, as follows:

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-feature android:name="android.hardware.telephony"
    android:required="true"/>

<application
    android:exported="true"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

I searched the internet but all the errors were about the <uses-permission/> syntax, could you help me please?

5

  • What version of Android are you testing on?

    Sep 17, 2015 at 16:47

  • I’m testing on android 6.0

    Sep 17, 2015 at 16:59

  • 1

    surely it will work on a below version of android. There’s a new philosophy of permissions in android 6.0

    – Fakher

    Sep 17, 2015 at 17:00


  • Is there a special syntax for android 6 ? How can i be sure it works on below version ?

    Sep 17, 2015 at 17:02

  • my previous targetsdkversion was 23 updated to 27 after app update READ_SMS permission not working which is already enabled. please help

    – Sagar

    Sep 27, 2018 at 13:27

250

(the following is extracted from a blog post of mine about this)

The big reason for not getting your permission nowadays is because
your project has a targetSdkVersion of 23 or higher, and the permission
that you are requesting is “dangerous”. In Android 6.0, this includes:

  • ACCEPT_HANDOVER
  • ACCESS_BACKGROUND_LOCATION
  • ACCESS_MEDIA_LOCATION
  • ACTIVITY_RECOGNITION
  • ANSWER_PHONE_CALLS
  • ACCESS_COARSE_LOCATION
  • ACCESS_FINE_LOCATION
  • ADD_VOICEMAIL
  • BODY_SENSORS
  • CALL_PHONE
  • CAMERA
  • GET_ACCOUNTS
  • PROCESS_OUTGOING_CALLS
  • READ_CALENDAR
  • READ_CALL_LOG
  • READ_CELL_BROADCASTS
  • READ_CONTACTS
  • READ_EXTERNAL_STORAGE
  • READ_PHONE_STATE
  • READ_SMS
  • RECEIVE_MMS
  • RECEIVE_SMS
  • RECEIVE_WAP_PUSH
  • RECORD_AUDIO
  • SEND_SMS
  • USE_SIP
  • WRITE_CALENDAR
  • WRITE_CALL_LOG
  • WRITE_CONTACTS
  • WRITE_EXTERNAL_STORAGE

For these permissions, not only does your targetSdkVersion 23+ app
need to have the <uses-permission> element(s), but you also have
to ask for those permissions at runtime from the user on Android 6.0+
devices, using methods like checkSelfPermission() and
requestPermissions().

As a temporary workaround, drop your targetSdkVersion below 23.

However, eventually, you will have some reason to want your
targetSdkVersion to be 23 or higher. At that time, you will need
to adjust your app to use the new runtime permission system.
The Android documentation has
a page dedicated to this topic.

15

  • 2

    Thank you very much, I used the requestPermissions() methods and i worked well

    Sep 17, 2015 at 17:15

  • 2

    @Ozzy: You need to be on a v23 generation of the support libraries (23.x.y, for current values of x and y), rather than the v22 that you are presently using.

    Jan 6, 2016 at 15:48

  • 3

    @NathanLoudjani Would you mind sharing your code that implements this? I am in the exact same boat and am struggling putting this into my activity.

    – dschuett

    Jan 23, 2016 at 3:52

  • 1

    @Leviathan: At the time, I got that list from the docs, I think from the page that I link to at the end of the answer. Unfortunately, Google seems to have dropped that list, which is both unfortunate and typical. For an individual permission, its entry in Manifest.permission should show its protection level, (e.g., ACCESS_COARSE_LOCATION).

    Oct 12, 2020 at 12:44

  • 1

    @Leviathan: “is there a way to explicity request permission for a regular permission?” — no, sorry. “Our data protection law requires to ask for Push Notifications explicity before sending them, but afaik they can be received as soon as the app is installed and they are in the manifest” — that is not a permission. Have the receiver or service be disabled in the manifest, show your own dialog, and if the user agrees, enable the component.

    Oct 12, 2020 at 13:05

33

Above API level 23 you will be given programmatically pragmatically like:

    private static final int PERMISSION_REQUEST_CODE = 1;

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {

        if (checkSelfPermission(Manifest.permission.SEND_SMS)
                == PackageManager.PERMISSION_DENIED) {

            Log.d("permission", "permission denied to SEND_SMS - requesting it");
            String[] permissions = {Manifest.permission.SEND_SMS};

            requestPermissions(permissions, PERMISSION_REQUEST_CODE);

        }
    }

    10

    request permission pragmatically (after API 23)

    if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.SEND_SMS)
        != PackageManager.PERMISSION_GRANTED) {
        // Permission is not granted 
        // Ask for permision
        ActivityCompat.requestPermissions(this,new String[] { Manifest.permission.SEND_SMS}, 1); 
    } 
    else {
    // Permission has already been granted
    }
    

    “If the app has the permission, the method checkSelfPermission() returns PERMISSION_GRANTED, and the app can proceed with the operation.

    If the app does not have the permission, the method returns PERMISSION_DENIED, and the app has to explicitly ask the user for permission. You need to prompt the user for that permission, as shown in the above code. Calling requestPermissions() brings up a standard Android dialog, which you cannot customize.”

    1

    • Where would we put this line? ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.SEND_SMS},1); and what does the 1 refer to?

      – LizG

      Oct 2, 2018 at 22:46