Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 661
Nathan Loudjani Avatar asked Sep 17 '15 16:09

Nathan Loudjani


People also ask

How do I declare and use permission in android?

To declare a permission only on devices that support runtime permissions—that is, devices that run Android 6.0 (API level 23) or higher—include the uses-permission-sdk-23 element instead of the uses-permission element. When using either of these elements, you can set the maxSdkVersion attribute.

How do you check if a permission is already granted Android?

To check if the user has already granted your app a particular permission, pass that permission into the ContextCompat. checkSelfPermission() method. This method returns either PERMISSION_GRANTED or PERMISSION_DENIED , depending on whether your app has the permission.

How can I tell if an Android user is denied permission?

Android provides a utility method, shouldShowRequestPermissionRationale() , that returns true if the user has previously denied the request, and returns false if a user has denied a permission and selected the Don't ask again option in the permission request dialog, or if a device policy prohibits the permission.


2 Answers

(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.

like image 73
CommonsWare Avatar answered Sep 29 '22 21:09

CommonsWare


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);          }     } 
like image 23
user7176550 Avatar answered Sep 29 '22 22:09

user7176550