2015-09-17 5 views
99

Ich versuche, Code zu schreiben, eine SMS von einem Android-App zu senden, aber wenn ich versuche, die SMS zu senden, sendet er mir den Fehler zurück:Android Erlaubnis funktioniert nicht, auch wenn ich erklärt haben, es

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) 

ich habe, aber ich habe die Berechtigungen in dem Manifest, wie folgt:

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

Ich suchte im Internet, aber alle Fehler waren über die <uses-permission/> Syntax, könnten Sie mir bitte helfen?

+0

Welche Android-Version testen Sie? – CommonsWare

+0

Ich teste auf Android 6.0 –

+1

sicherlich wird es auf eine unten Version von Android arbeiten. Es gibt eine neue Philosophie der Berechtigungen in Android 6.0 – Fakher

Antwort

172

(folgende aus a blog post of mine about this extrahiert)

Der große Grund für die nicht Ihre Erlaubnis heutzutage bekommen, weil Ihr Projekt ein targetSdkVersion von 23 oder höher hat, und die Erlaubnis , die Sie anfordern, ist " gefährlich". In Android 6.0, diese beinhaltet:

  • 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

Für diese Berechtigungen nicht nur Ihre targetSdkVersion 23+ App müssen das <uses-permission> Element (e) haben, aber auch für diese Berechtigungen zur Laufzeit vom Benutzer auf Android 6.0+ Geräte zu bitten, den Einsatz von Methoden wie checkSelfPermission() und requestPermissions().

als eine vorübergehende Lösung, lassen Sie Ihren targetSdkVersion unter 23.

jedoch schließlich werden Sie aus irgendeinem Grund haben wollen Ihre targetSdkVersion 23 oder höher zu sein. Zu diesem Zeitpunkt benötigen Sie , um Ihre App so anzupassen, dass sie das neue Laufzeitberechtigungssystem verwendet. Die Android-Dokumentation hat a page dedicated to this topic.

+1

Vielen Dank, ich habe die requestPermissions() -Methoden verwendet und ich habe gut gearbeitet –

+0

Danke, es hat mir sehr geholfen! :) –

+0

Okay, ich habe dies zuvor versucht, konnte aber nicht die Methoden ContextCompat.checkSelfPermission und ActivityCompat.requestPermissions bekommen Gib mir einen 'nicht gefunden' Fehler bei den Methodennamen. Ich vermute, es ist mit einer fehlenden Bibliothek zu tun, es scheint in einem v4-Paket, aber meine einzige gradle Abhängigkeit ist 'kompilieren‚com.android.support zu sein: appcompat-v7: 22.2.1''. Sollte ich das auf v4 ändern? – Ozzy

-3

Da sdk 23 oder höher eine neue Möglichkeit zum Anfordern von Berechtigungen einführt, wird dieser Fehler angezeigt, wenn Sie in Marshmallow laufen.

Lösung: Set targetSdkVersion unten 23 in Manifest-Datei wie diese android: targetSdkVersion = "21"

3

Wenn Sie sdk verwenden 23 oder höher als Sie Zeit Berechtigungen ausgeführt werden, bestätigen.

0

Zusammen mit CommonsWare Antwort,

Es gibt eine Sicherheitseinstellung (I auf CM13 geprüft) SMS Nachricht Grenze zu setzen. Wenn Sie dies auf "None" setzen, öffnet das Betriebssystem einen Dialog für jede SMS, auch nachdem Sie die SMS_SEND-Berechtigung in der Laufzeit erhalten haben. Am besten stellen Sie dies auf Maximum ein.

Wenn das Maximum nicht genug ist, gibt es Möglichkeiten, zu der die maximale Rate auf einem verwurzelten Gerät.

2

, wenn Sie erklären permisson in Manifest und es funktioniert nicht bedeutet, dass Sie Aufgabe in MarshMallow durchführen und für MarshMallow haben Sie permisson bei RunTime gesetzt.

wie auf diese Weise

ActivityCompat.requestPermissions(); 
0

ich das mein MainActivity hinzugefügt, lösen, dass mein Problem

 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

über API-Ebene 23 Sie die Erlaubnis gegeben werden pragmatisch wie:

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);
nach API 23

0

Wenn Sie die Android-Version "23" oder "23+" verwenden, zeigt die App Fehler an, wenn Sie versuchen, auf etwas zuzugreifen, für das eine Benutzererlaubnis erforderlich ist. Sie müssen zur Laufzeit nach Berechtigungen fragen, auch wenn Sie diese Berechtigungen im Android-Manifest deklariert haben.

prüft dies: https://developer.android.com/training/permissions/requesting.html

Aber wenn Sie Ihre gesamte Anwendung erstellt und wollen nicht an jeder Stelle ändern, dann ein wenig betrug ausreichend.

Gehen Sie zu „Build.gradle“ Datei und ändern Sie die Ziel Sdk Version auf weniger als 23, wie 22, 21