2015-09-17 19 views
99

Sto cercando di scrivere il codice per inviare uno SMS da un app Android, ma quando cerco di inviare l'SMS che mi rimanda l'errore:il permesso di Android non funziona anche se ho dichiarato

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) 

ho controllato ma non ho le autorizzazioni nel manifesto, come segue:

<?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> 

Ho cercato su Internet ma tutti gli errori riguardavano la sintassi <uses-permission/>, potresti aiutarmi per favore?

+0

Quale versione di Android stai testando su? – CommonsWare

+0

Sto testando su Android 6.0 –

+1

sicuramente funzionerà su una versione successiva di Android. C'è una nuova filosofia di permessi in Android 6.0 – Fakher

risposta

172

(Quello che segue è estratto da a blog post of mine about this)

Il grande motivo per non ottenere il vostro permesso al giorno d'oggi è perché il progetto ha un targetSdkVersion di 23 o superiore, e il permesso che si richiede è " pericoloso". In Android 6.0, questo include:

  • 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

Per queste autorizzazioni, non solo il vostro targetSdkVersion 23+ app bisogno di avere l'elemento (s) <uses-permission>, ma si hanno anche chiedere le autorizzazioni in fase di esecuzione da parte dell'utente su Android 6.0+ dispositivi, utilizzando metodi come checkSelfPermission() e requestPermissions().

Come soluzione temporanea, cadere il vostro targetSdkVersion sotto 23.

Tuttavia, alla fine, si avrà qualche motivo per voler vostro targetSdkVersion di essere 23 o superiore. A quel tempo, avrai bisogno di per regolare la tua app per utilizzare il nuovo sistema di autorizzazione runtime. La documentazione di Android ha a page dedicated to this topic.

+1

Grazie mille, ho usato i metodi requestPermissions() e ho lavorato bene –

+0

Grazie, mi ha aiutato molto :) :) –

+0

Okay, ho provato prima ma non ho potuto ottenere i metodi ContextCompat.checkSelfPermission e ActivityCompat.requestPermissions, loro dammi un errore 'non trovato' sui nomi dei metodi. Immagino che abbia a che fare con una libreria mancante, sembra essere in un pacchetto v4 ma la mia unica dipendenza gradle è 'compile 'com.android.support: appcompat-v7: 22.2.1''. Dovrei cambiare questo in v4? – Ozzy

-3

Come sdk 23 o superiore introduce un nuovo modo di richiedere le autorizzazioni, quindi se si esegue in Marshmallow mostrerà questo errore.

Soluzione: Set targetSdkVersion muggito 23 nel file manifesto come questo android: targetSdkVersion = "21"

3

Se si utilizza SDK 23 o superiore, allora è necessario verificare le autorizzazioni di eseguire in tempo.

0

Insieme con la risposta di CommonsWare,

C'è un'impostazione di protezione (ho controllato su CM13) per impostare messaggi SMS Limit. Se si imposta su "Nessuno", il sistema operativo aprirà una finestra di dialogo per ogni SMS, anche dopo aver ottenuto l'autorizzazione SMS_SEND nel runtime. La cosa migliore è impostare al massimo.

Se il valore massimo non è sufficiente, esistono modi per aumentare la velocità massima su un dispositivo rooted.

2

Quando si dichiara permisson in Manifest e non è lavoro significa che si sta eseguendo in Task MarshMallow e per MarshMallow aver impostato permisson a RunTime.

come questo senso

ActivityCompat.requestPermissions(); 
0

ho aggiunto questo al mio MainActivity, che risolvere il mio problema

 int MY_PERMISSIONS_REQUEST_READ_CONTACTS=0; 
// Here, thisActivity is the current activity 
     if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       != PackageManager.PERMISSION_GRANTED) { 

      // Should we show an explanation? 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 

       // Show an expanation to the user *asynchronously* -- don't block 
       // this thread waiting for the user's response! After the user 
       // sees the explanation, try again to request the permission. 

      } else { 

       // No explanation needed, we can request the permission. 

       ActivityCompat.requestPermissions(this, 
         new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
         MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

       // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
       // app-defined int constant. The callback method gets the 
       // result of the request. 
      } 
     } 
15

Sopra il livello di API 23 vi verrà dato il permesso in modo pragmatico come:

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); 

     } 
    } 
1

ActivityCompat.requestPermissions (this, new String [] {Manifest.permission.SEND_SMS}, 1);
dopo API 23

0

Se si utilizza la versione di Android "23" o "23+", quindi applicazione vi mostrerà gli errori quando si sta cercando di accedere a qualsiasi cosa che richiede l'autorizzazione dell'utente. Devi chiedere le autorizzazioni in fase di esecuzione anche se hai dichiarato tali permessi nel manifest di Android.

Controllare questo: https://developer.android.com/training/permissions/requesting.html

Ma se avete creato la vostra intera applicazione e non volete cambiare ad ogni luogo poi un po 'imbroglione sarà sufficiente.

Vai a file "Build.gradle" e modificare il target versione SDK per meno di 23, come 22, 21.

Problemi correlati