Ich versuche, Code zum Senden einer SMS von einer Android-App zu schreiben, aber wenn ich versuche, die SMS zu senden, wird mir der folgende Fehler zurückgesendet:
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 überprü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önnen Sie mir bitte helfen?
java
android
android-permissions
Nathan Loudjani
quelle
quelle
targetsdkversion
wurde23
aktualisiert,27
nachdem dieREAD_SMS
Berechtigung zum Aktualisieren der App nicht funktioniert, was bereits aktiviert ist. Bitte helfen SieAntworten:
(Das Folgende ist aus einem Blog-Beitrag von mir darüber extrahiert )
Der Hauptgrund dafür, dass Sie heutzutage keine Erlaubnis erhalten, ist, dass Ihr Projekt eine Berechtigung
targetSdkVersion
von 23 oder höher hat und die von Ihnen angeforderte Erlaubnis "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+ App nicht nur über die<uses-permission>
Elemente verfügen , sondern Sie müssen diese Berechtigungen auch zur Laufzeit vom Benutzer auf Android 6.0+ Geräten mit Methoden wiecheckSelfPermission()
und anfordernrequestPermissions()
.Lassen Sie als vorübergehende Problemumgehung Ihre
targetSdkVersion
unter 23 fallen.Irgendwann werden Sie jedoch einen Grund haben zu wollen
targetSdkVersion
, dass Sie 23 oder höher sind. Zu diesem Zeitpunkt müssen Sie Ihre App anpassen, um das neue Laufzeitberechtigungssystem verwenden zu können. Die Android-Dokumentation enthält eine Seite zu diesem Thema .quelle
compile 'com.android.support:appcompat-v7:22.2.1'
. Soll ich das auf v4 ändern?23.x.y
für aktuelle Werte von x und y) und nicht auf der v22, die Sie derzeit verwenden.Oberhalb von API Level 23 erhalten Sie programmatisch pragmatisch Folgendes:
quelle
Erlaubnis pragmatisch anfordern (nach API 23)
"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 nicht über die Berechtigung verfügt, gibt die Methode PERMISSION_DENIED zurück, und die App muss den Benutzer explizit um Erlaubnis bitten. 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. "
quelle
Wenn Sie SDK 23 oder höher verwenden, müssen Sie die Laufzeitberechtigungen überprüfen.
quelle
wenn Sie erklären
permisson
inManifest
und es wird nicht funktionieren Mittel Sie Aufgabe ausführen inMarshMallow
und fürMarshMallow
Sie bei permisson gesetzt habenRunTime
.so
quelle
Bitte gehen Sie über den unten stehenden Link https://developer.android.com/guide/topics/permissions/overview.html
Dort sind auch einige Beispiele verfügbar, um mit den Berechtigungen zu beginnen.
Um Android jetzt sicherer zu machen, müssen Entwickler die Berechtigung im Manifest erwähnen und den Benutzer zur Laufzeit bitten, die Arbeit zu erledigen. Sie sind Berechtigungen, die im Abschnitt "Gefährliche Berechtigungen" aufgeführt sind und unten aufgeführt sind
KALENDER
KAMERA
KONTAKTE
ORT
MIKROFON
TELEFON
SENSOREN
SMS
LAGER
quelle
Ich habe dies zu meiner MainActivity hinzugefügt, um mein Problem zu beheben
quelle
Wenn Sie die Android-Version "23" oder "23+" verwenden, zeigt die App Fehler an, wenn Sie versuchen, auf etwas zuzugreifen, für das die Erlaubnis des Benutzers erforderlich ist. Sie müssen zur Laufzeit nach Berechtigungen fragen, auch wenn Sie diese Berechtigungen im Android-Manifest deklariert haben.
Überprüfen Sie dies: https://developer.android.com/training/permissions/requesting.html
Wenn Sie jedoch Ihre gesamte Anwendung erstellt haben und nicht an jedem Ort Änderungen vornehmen möchten, ist ein kleiner Cheat ausreichend.
Gehen Sie zur Datei "Build.gradle" und ändern Sie die Sdk-Zielversion auf weniger als 23, z. B. 22, 21.
quelle
Zusammen mit der Antwort von CommonsWare
Es gibt eine Sicherheitseinstellung (ich habe CM13 überprüft), um das SMS-Nachrichtenlimit festzulegen. Wenn Sie dies auf "Keine" setzen, öffnet das Betriebssystem für jede SMS einen Dialog, auch nachdem Sie zur Laufzeit die SMS_SEND-Berechtigung erhalten haben. Am besten setzen Sie dies auf Maximum.
Wenn das Maximum nicht ausreicht, gibt es Möglichkeiten, die maximale Rate auf einem gerooteten Gerät zu erhöhen.
quelle
Mit diesem Code können Sie auf Ihre Nachrichten zugreifen
Öffnen Sie einen Dialog mit dem folgenden Code:
Erhalten Sie das Aktivitätsergebnis wie folgt:
oder bearbeiten Sie die Datei
build.gradle
und die Chanche-NummertargetSdkVersion
kleiner als23
Und benötigen Sie den obigen Code nicht mehr
HINWEIS
Dies ist natürlich nicht der Fall und nur ein pädagogischer Aspekt
quelle
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 sie zugelassen, aber ich hatte immer noch einen Absturz, dass der Prozess nicht über die angeforderte Berechtigung zum Senden von SMS verfügt. Ich hatte die erteilten Berechtigungen überprüft von:
Die Reihenfolge meiner Ersuchen um Erlaubnis war
Ich habe die Reihenfolge der Anfrage zurückgesetzt und es funktioniert gut. 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 !!)
quelle
Ich hoffe, dass die Lösung zum Schreiben in einen externen Speicher auch nützlich ist
quelle
Eine Liste aller Berechtigungen finden Sie unter Erläuterung unter
Manifest.permission
quelle