Estoy tratando de escribir código para enviar un SMS desde una aplicación de Android, pero cuando intento enviar el SMS, me devuelve el error:
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)
Lo comprobé pero tengo los permisos en el manifiesto, de la siguiente manera:
<?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>
Busqué en Internet pero todos los errores estaban relacionados con la <uses-permission/>
sintaxis, ¿podrían ayudarme por favor?
java
android
android-permissions
Nathan Loudjani
fuente
fuente
targetsdkversion
se23
actualizó a27
después de que elREAD_SMS
permiso de actualización de la aplicación no funciona, que ya está habilitado. por favor ayudaRespuestas:
(Lo siguiente se extrae de una publicación de blog mía sobre esto )
La gran razón para no obtener su permiso hoy en día es porque su proyecto tiene un
targetSdkVersion
23 o más, y el permiso que solicita es "peligroso". En Android 6.0, esto incluye: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
Para estos permisos, no solo su
targetSdkVersion
aplicación 23+ necesita tener los<uses-permission>
elementos, sino que también debe solicitar esos permisos en tiempo de ejecución al usuario en dispositivos Android 6.0+, usando métodos comocheckSelfPermission()
yrequestPermissions()
.Como solución temporal, deje caer sus
targetSdkVersion
23 por debajo.Sin embargo, eventualmente, tendrás alguna razón para querer
targetSdkVersion
que tengas 23 años o más. En ese momento, deberá ajustar su aplicación para usar el nuevo sistema de permisos de tiempo de ejecución. La documentación de Android tiene una página dedicada a este tema .fuente
compile 'com.android.support:appcompat-v7:22.2.1'
. ¿Debo cambiar esto a v4?23.x.y
para los valores actuales de x e y), en lugar de la v22 que está utilizando actualmente.Por encima del nivel 23 de API, se le proporcionará mediante programación pragmáticamente como:
fuente
solicitar permiso pragmáticamente (después de API 23)
"Si la aplicación tiene el permiso, el método checkSelfPermission () devuelve PERMISSION_GRANTED, y la aplicación puede continuar con la operación.
Si la aplicación no tiene el permiso, el método devuelve PERMISSION_DENIED, y la aplicación tiene que pedirle permiso explícitamente al usuario. Debe solicitar al usuario ese permiso, como se muestra en el código anterior. Al llamar a requestPermissions (), aparece un cuadro de diálogo estándar de Android que no puede personalizar ".
fuente
Si está utilizando SDK 23 o superior, debe verificar los permisos de tiempo de ejecución.
fuente
cuando se declara
permisson
enManifest
y no de trabajo significa que usted esté realizando tareas enMarshMallow
y paraMarshMallow
que haya configurado en permissonRunTime
.de esta manera
fuente
Visite el siguiente enlace, https://developer.android.com/guide/topics/permissions/overview.html
Algunas muestras también están disponibles allí para comenzar con los permisos.
Para hacer que Android sea más seguro ahora, los desarrolladores deben mencionar el permiso en manifiesto, así como también deberían pedirle al usuario en tiempo de ejecución que realice el trabajo. Son permisos categorizados en la sección de permisos peligrosos que se mencionan a continuación
CALENDARIO
CÁMARA
CONTACTOS
UBICACIÓN
MICRÓFONO
TELÉFONO
SENSORES
SMS
ALMACENAMIENTO
fuente
Agregué esto a mi actividad principal, que resuelve mi problema
fuente
Si está utilizando la versión de Android "23" o "23+", la aplicación le mostrará errores cuando intente acceder a cualquier cosa que requiera permiso del usuario. Tiene que solicitar permisos en tiempo de ejecución, incluso si ha declarado esos permisos en el manifiesto de Android.
Verifique esto: https://developer.android.com/training/permissions/requesting.html
Pero si ha creado toda su aplicación y no quiere cambiar en cada lugar, entonces un poco de trampa será suficiente.
Vaya al archivo "Build.gradle" y cambie la versión de Sdk de destino a menos de 23, como 22, 21.
fuente
Junto con la respuesta de CommonsWare,
Hay una configuración de seguridad (verifiqué en CM13) para establecer el límite de mensajes SMS. Si establece esto en "Ninguno", el sistema operativo abrirá un cuadro de diálogo para cada SMS, incluso después de obtener el permiso SMS_SEND en el tiempo de ejecución. Lo mejor es configurar esto al máximo.
Si el máximo no es suficiente, hay formas de aumentar la tasa máxima en un dispositivo rooteado.
fuente
Puedes usar este código para acceder a tus mensajes
Abra un cuadro de diálogo con el siguiente código:
Obtenga el resultado de la actividad de la siguiente manera:
o edite el archivo
build.gradle
y el número de cambiotargetSdkVersion
menos de23
Y ya no necesita el código anterior
NOTA
Por supuesto, este no es el caso, y es solo un aspecto educativo
fuente
Así que tuve que crear una aplicación para enviar y recibir mensajes, pero la acción de envío se bloqueaba cada vez que hacía clic en enviar a pesar de que se me concedió el permiso. Solicité permisos de tiempo de ejecución y los permití, pero me enfrenté a un bloqueo que el proceso no tiene el permiso solicitado para enviar SMS. Verifiqué los permisos otorgados de:
El orden de mi solicitud de permisos fue
Revertí el orden de solicitud y funciona bien. Esto se probó con una nueva aplicación completa (desinstalar-> instalar -> probar). La respuesta puede parecer extraña, pero solo inténtalo.
(Si funciona de la manera mostrada en un cierto orden, ¡entonces Android podría tener un error!)
fuente
Espero que la solución para escribir en almacenamiento externo también sea útil
fuente
La lista de todos los permisos se puede encontrar con una explicación en
Permiso manifiesto
fuente