it-swarm.com.de

Die Android-Berechtigung funktioniert nicht, auch wenn ich sie erklärt habe

Ich versuche, Code zu schreiben, um eine SMS von einer Android-App aus zu senden. Wenn ich jedoch versuche, die SMS zu senden, wird der Fehler zurückgegeben:

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 geprüft, aber ich habe die Berechtigungen im 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 habe im Internet gesucht, aber alle Fehler betrafen die <uses-permission/>-Syntax. Könnten Sie mir bitte helfen?

139
Nathan Loudjani

(Das Folgende ist aus einem Blogbeitrag dazu ) extrahiert.

Der Hauptgrund, warum Sie heute keine Erlaubnis erhalten, ist, dass Ihr Projekt eine targetSdkVersion von 23 oder höher hat und die Erlaubnis , Die Sie anfragen, "gefährlich" ist. In Android 6.0 umfasst dies:

  • 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 muss Ihre targetSdkVersion 23+ -Anwendung__ nicht nur über das <uses-permission>-Element verfügen, sondern Sie haben auch die Möglichkeit, diese Berechtigungen zur Laufzeit vom Benutzer auf Android 6.0 + -Geräten anzufordern mit Methoden wie checkSelfPermission() und requestPermissions().

Lassen Sie Ihre targetSdkVersion als temporäre Problemumgehung unter 23.

Irgendwann werden Sie jedoch einen Grund haben, Ihre targetSdkVersion auf 23 oder höher zu setzen. Zu diesem Zeitpunkt müssen Sie anpassen, um Ihre App für die Verwendung des neuen Laufzeitberechtigungssystems anzupassen .__ Die Android-Dokumentation enthält eine Seite, die diesem Thema gewidmet ist .

213
CommonsWare

Oberhalb von API-Level 23 werden Sie programmatisch pragmatisch wie folgt gegeben:

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

        }
    }
24
user7176550

berechtigung pragmatisch anfordern (nach 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
}

"Wenn die App über die Berechtigung verfügt, gibt die Methode checkSelfPermission () PERMISSION_GRANTED zurück, und die App kann mit dem Vorgang fortfahren. 

Wenn die App keine Berechtigung hat, gibt die Methode PERMISSION_DENIED zurück, und die App muss den Benutzer explizit um Erlaubnis fragen. Sie müssen den Benutzer zur Eingabe dieser Berechtigung auffordern, wie im obigen Code gezeigt. Wenn Sie requestPermissions () aufrufen, wird ein Standard-Android-Dialogfeld angezeigt, das Sie nicht anpassen können. "

7
Dan Alboteanu

Wenn Sie SDK 23 oder höher verwenden, müssen Sie die Laufzeitberechtigungen überprüfen.

6

wenn Sie permisson in Manifest deklarieren und nicht funktionieren, bedeutet dies, dass Sie Task in Marshmallow ausführen, und für Marshmallow haben Sie Permisson auf RunTime gesetzt.

wie auf diese Weise

ActivityCompat.requestPermissions();
5
Ironman

Bitte gehen Sie durch den Link unten https://developer.Android.com/guide/topics/permissions/overview.html

Dort sind auch einige Beispiele verfügbar, um mit den Berechtigungen zu beginnen.

Um Android sicherer zu machen, müssen Entwickler jetzt die Berechtigung im Manifest angeben, und sie sollten den Benutzer auch zur Laufzeit fragen, um die Arbeit zu erledigen. Sie sind in der Kategorie "Erlaubnis" aufgeführt, deren Erlaubnis unten aufgeführt ist

KALENDER 

READ_CALENDAR

WRITE_CALENDAR

KAMERA 

CAMERA

KONTAKTE 

READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS

STANDORT 

ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION

MIKROFON 

RECORD_AUDIO

PHONE 

READ_PHONE_STATE
READ_PHONE_NUMBERS
CALL_PHONE
ANSWER_PHONE_CALLS (must request at runtime)
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
ANSWER_PHONE_CALLS

SENSOREN 

BODY_SENSORS

SMS 

SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_Push
RECEIVE_MMS

LAGER 

READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
4
Rishabh Saxena

Ich habe dies zu meiner MainActivity hinzugefügt, um mein Problem zu lösen 

       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.
            }
        }
2
Masquitos

Wenn Sie die Android-Version "23" oder "23+" verwenden, zeigt die App Fehler an, wenn Sie versuchen, auf etwas zuzugreifen, für das der Benutzer die Berechtigung benötigt. Sie müssen zur Laufzeit nach Berechtigungen fragen, auch wenn Sie diese Berechtigungen im Android-Manifest angegeben haben.

Überprüfen Sie dies: https://developer.Android.com/training/permissions/requesting.html

Wenn Sie jedoch Ihre gesamte Anwendung erstellt haben und sich nicht an jedem Ort ändern möchten, reicht ein kleiner Cheat aus.

Gehen Sie zur Datei "Build.gradle" und ändern Sie die Ziel-Sdk-Version auf weniger als 23 (z. B. 22, 21).

1
Zohaib Hassan

Zusammen mit der Antwort von CommonsWare

Es gibt eine Sicherheitseinstellung (ich habe das CM13 überprüft), um das Nachrichtenlimit SMS festzulegen. Wenn Sie "Keine" einstellen, zeigt das Betriebssystem für jede SMS einen Dialog an, auch nachdem Sie die Berechtigung SMS_SEND in der Laufzeit erhalten haben. Am besten setzen Sie diese Option auf Maximum.

Wenn das Maximum nicht ausreicht, gibt es Möglichkeiten, die Maximalrate auf einem gerooteten Gerät zu erhöhen.

1

Also musste ich eine App erstellen, um Nachrichten zu senden und zu empfangen, aber die Sendeaktion stürzte ab, wenn ich auf Senden klickte, obwohl die Berechtigung erteilt wurde. Ich hatte Laufzeitberechtigungen angefordert und ihnen zugestanden, dennoch stieß ich auf einen Absturz, bei dem der Prozess nicht über die angeforderte Berechtigung zum Senden von SMS verfügt. Ich hatte die erteilten Berechtigungen überprüft von:

adb Shell dumpsys package <package-name>

Die Reihenfolge meiner Anfrage nach Berechtigungen war

  1. RECEIVE_SMS
  2. SMS SENDEN

Ich habe die Reihenfolge der Anforderung zurückgesetzt und es funktioniert einwandfrei. Dies wurde mit einer komplett neuen App getestet (deinstallieren -> installieren -> testen). Die Antwort mag seltsam erscheinen, aber probieren Sie es einfach aus.

(Wenn es in einer bestimmten Reihenfolge auf die gezeigte Weise funktioniert, hat Android möglicherweise einen Fehler !!)

Mit diesem Code können Sie auf Ihre Nachrichten zugreifen

Öffnen Sie einen Dialog mit dem folgenden Code:

ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    1);

Holen Sie sich das Aktivitätsergebnis wie folgt:

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {

          // If request is cancelled, the result arrays are empty.
          if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.          
            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

oder bearbeiten Sie die Datei build.gradle und die Änderungsnummer targetSdkVersion weniger als 23____.
Und den Code oben nicht mehr benötigen

HINWEIS
Natürlich ist das nicht der Fall, und es ist nur ein pädagogischer Aspekt

0
Amirhf

Ich hoffe, dass die Lösung zum Schreiben auf externen Speicher auch nützlich sein wird

public  boolean checkPermission() {
        if (Build.VERSION.SDK_INT >= 23) {
            if (checkSelfPermission(Android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {
                Timber.tag(LOG_TAG).e("Permission error. You have permission");
                return true;
            } else {
                Timber.tag(LOG_TAG).e("Permission error. You have asked for permission");
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                return false;
            }
        }
        else { 
            // for a stuff below api level 23
            Timber.tag(LOG_TAG).e("Permission error. You already have the permission");
            return true;
        }
    }
0
SergeyUr