J'essaie d'écrire du code pour envoyer un SMS à partir d'une application Android, mais lorsque j'essaie d'envoyer le SMS, cela me renvoie l'erreur:
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)
J'ai vérifié mais j'ai les autorisations dans le manifeste, comme suit:
<?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>
J'ai cherché sur Internet mais toutes les erreurs concernaient la <uses-permission/>
syntaxe, pourriez-vous m'aider s'il vous plaît?
java
android
android-permissions
Nathan Loudjani
la source
la source
targetsdkversion
été23
mis à jour27
après que l'READ_SMS
autorisation de mise à jour de l' application ne fonctionne pas, ce qui est déjà activé. s'il vous plaît aiderRéponses:
(ce qui suit est extrait d' un article de mon blog à ce sujet )
La principale raison pour laquelle vous n'obtenez pas votre permission de nos jours est que votre projet a une valeur
targetSdkVersion
de 23 ou plus et que la permission que vous demandez est "dangereuse". Dans Android 6.0, cela comprend: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
Pour ces autorisations, non seulement votre
targetSdkVersion
application 23+ doit avoir le ou les<uses-permission>
éléments, mais vous devez également demander ces autorisations au moment de l'exécution à l'utilisateur sur les appareils Android 6.0+, en utilisant des méthodes telles quecheckSelfPermission()
etrequestPermissions()
.En guise de solution temporaire, déposez votre
targetSdkVersion
sous 23.Cependant, vous aurez éventuellement des raisons de vouloir
targetSdkVersion
avoir 23 ans ou plus. À ce moment-là, vous devrez ajuster votre application pour utiliser le nouveau système d'autorisation d'exécution. La documentation Android a une page dédiée à ce sujet .la source
compile 'com.android.support:appcompat-v7:22.2.1'
. Dois-je changer cela en v4?23.x.y
, pour les valeurs actuelles de x et y), plutôt que sur la v22 que vous utilisez actuellement.Au-dessus du niveau 23 de l'API, vous recevrez de manière pragmatique comme:
la source
demander l'autorisation de manière pragmatique (après l'API 23)
"Si l'application dispose de l'autorisation, la méthode checkSelfPermission () renvoie PERMISSION_GRANTED, et l'application peut poursuivre l'opération.
Si l'application n'a pas l'autorisation, la méthode retourne PERMISSION_DENIED et l'application doit explicitement demander l'autorisation à l'utilisateur. Vous devez demander à l'utilisateur cette autorisation, comme indiqué dans le code ci-dessus. L'appel de requestPermissions () ouvre une boîte de dialogue Android standard, que vous ne pouvez pas personnaliser. "
la source
Si vous utilisez sdk 23 ou supérieur, vous devez vérifier les autorisations d'exécution.
la source
lorsque vous déclarez
permisson
dansManifest
et son travail ne signifie que vous effectuez des tâches dansMarshMallow
etMarshMallow
vous avez mis permisson àRunTime
.comme ça
la source
Veuillez suivre le lien ci-dessous, https://developer.android.com/guide/topics/permissions/overview.html
Quelques exemples y sont également disponibles pour commencer avec les permissions.
Pour rendre Android plus sécurisé, les développeurs doivent maintenant mentionner l'autorisation dans le manifeste et doivent également demander à l'utilisateur au moment de l'exécution de faire le travail. Ils sont des autorisations classées dans la section des autorisations dangereuses qui sont mentionnées ci-dessous
CALENDRIER
CAMÉRA
CONTACTS
EMPLACEMENT
MICROPHONE
TÉLÉPHONE
CAPTEURS
SMS
ESPACE DE RANGEMENT
la source
J'ai ajouté ceci à ma MainActivity, qui résout mon problème
la source
Si vous utilisez la version Android "23" ou "23+", l'application vous montrera des erreurs lorsque vous essayez d'accéder à tout ce qui nécessite l'autorisation de l'utilisateur. Vous devez demander des autorisations au moment de l'exécution même si vous avez déclaré ces autorisations dans le manifeste Android.
Vérifiez ceci: https://developer.android.com/training/permissions/requesting.html
Mais si vous avez créé toute votre application et que vous ne voulez pas changer à chaque endroit, une petite astuce sera suffisante.
Allez dans le fichier "Build.gradle" et changez la version Sdk cible en moins de 23, comme 22, 21.
la source
Avec la réponse de CommonsWare,
Il existe un paramètre de sécurité (j'ai vérifié sur CM13) pour définir la limite de message SMS. Si vous définissez ceci sur "Aucun", le système d'exploitation affichera une boîte de dialogue pour chaque SMS, même après avoir obtenu l'autorisation SMS_SEND dans le runtime. La meilleure chose à faire est de régler ce paramètre au maximum.
Si le maximum ne suffit pas, il existe des moyens d'augmenter le débit maximum sur un appareil enraciné.
la source
Vous pouvez utiliser ce code pour accéder à vos messages
Ouvrez une boîte de dialogue en utilisant le code ci-dessous:
Obtenez le résultat de l'activité comme ci-dessous:
ou éditez le fichier
build.gradle
et le numéro de changementtargetSdkVersion
inférieur à23
Et vous n'avez plus besoin du code ci-dessus
NOTE
Bien sûr, ce n'est pas le cas, et c'est juste un aspect éducatif
la source
J'ai donc dû créer une application pour envoyer et recevoir des messages, mais l'action d'envoi plantait chaque fois que je cliquais sur envoyer même si l'autorisation était accordée. J'avais demandé des autorisations d'exécution et je les ai autorisées, mais j'ai toujours fait face à un plantage que le processus n'a pas l'autorisation requise pour envoyer des SMS. J'avais vérifié les autorisations accordées à partir de:
L'ordre de ma demande d'autorisation était
J'ai inversé l'ordre de la demande et cela fonctionne très bien. Cela a été testé avec une nouvelle application complète (désinstallation-> installation -> test). La réponse peut sembler étrange, mais essayez-la.
(Si cela fonctionne de la manière indiquée dans un certain ordre, alors Android pourrait avoir un bogue !!)
la source
J'espère que la solution pour écrire sur un stockage externe sera également utile
la source
La liste de toutes les autorisations peut être trouvée avec une explication sur
Manifest.permission
la source