En Lollipop, la funcionalidad de descarga funciona bien en mi aplicación, pero cuando actualicé a Marshmallow, mi aplicación se bloquea y da este error cuando intento descargar de Internet en la tarjeta SD:
Neither user nor current process has android.permission.WRITE_EXTERNAL_STORAGE
Se queja de esta línea de código:
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
Tengo los permisos en el manifiesto fuera de la aplicación:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
Limpié y reconstruí el proyecto, pero aún se bloquea.
Respuestas:
Debe verificar si el usuario ha otorgado permiso de almacenamiento externo utilizando:
De lo contrario, debe solicitar al usuario que otorgue un permiso a su aplicación:
Por supuesto, estos son solo para dispositivos de malvavisco, por lo que debe verificar si su aplicación se está ejecutando en Marshmallow:
Asegúrese también de que su actividad implemente
OnRequestPermissionResult
El permiso completo se ve así:
Devolución de llamada de resultado de permiso:
fuente
Manifest.permission.WRITE_EXTERNAL_STORAGE
siempre devuelve '-1', es decir, Permiso denegado. Consulte la nueva documentación, dice que para API 19 en adelante, no necesita elWRITE_EXTERNAL_STORAGE
permiso. Como se mencionó en algunos de los comentarios anteriores, debe hacer todo esto con elManifest.permission.READ_EXTERNAL_STORAGE
getExternalFilesDir()
. En otros casos, aún seandroid.permission.WRITE_EXTERNAL_STORAGE
debe declarar el permiso en la forma más humana.La cortesía se dirige a Solicitar permisos en tiempo de ejecución .
Ejemplo
Declara esto como Global
Agrega esto en tu
onCreate()
secciónDespués de setContentView (R.layout.your_xml);
Ahora agregando checkPermission () y requestPermission ()
FYI
onRequestPermissionsResult
fuente
Verifique el permiso múltiple en el nivel 23 de API Paso 1:
Paso 2:
Paso 3:
Paso 4: en onCreate of Activity checkPermissions ();
fuente
never ask again
y faltan algunos permisos? ¿El usuario recibe algún comentario? Hubiera sido agradable ver un ejemplo real de este o más comentarios en sus fragmentos de código.A menos que exista un requisito definitivo de escritura en almacenamiento externo, siempre puede elegir guardar archivos en el directorio de la aplicación. En mi caso tuve que guardar archivos y después de perder 2 o 3 días descubrí si cambio la ruta de almacenamiento de
a
Funciona a la perfección en todos los dispositivos. Esto se debe a que para escribir en almacenamiento externo necesita permisos adicionales, pero escribir en el directorio interno de la aplicación es simple.
fuente
debe usar el permiso de tiempo de ejecución en malvavisco https://developer.android.com/training/permissions/requesting.html
puedes consultar la información de la aplicación -> permiso
¿su aplicación obtiene permiso para escribir almacenamiento externo o no?
fuente
Parece que el usuario ha rechazado el permiso y la aplicación intenta escribir en un disco externo, causando un error.
Consulte https://developer.android.com/training/permissions/requesting.html
Este video le dará una mejor idea sobre UX, manejo de permisos de tiempo de ejecución https://www.youtube.com/watch?v=iZqDdvhTZj0
fuente
Desde la versión de malvavisco, los desarrolladores deben solicitar permisos de tiempo de ejecución al usuario. Déjame darte todo el proceso para solicitar permisos de tiempo de ejecución.
Estoy usando referencia desde aquí: permisos de tiempo de ejecución de malvavisco android .
Primero cree un método que verifique si se otorgan o no todos los permisos
Ahora aquí está el código que se ejecuta después del método anterior. Anularemos el
onRequestPermissionsResult()
método:Si el usuario hace clic en la opción Denegar , el
showDialogOK()
método se usará para mostrar el diálogoSi el usuario hace clic en Denegar y también hace clic en una casilla de verificación que dice "nunca volver a preguntar" ,
explain()
se utilizará el método para mostrar el diálogo.métodos para mostrar diálogos:
El fragmento de código anterior solicita cuatro permisos a la vez. También puede solicitar cualquier número de permisos en cualquier actividad según sus requisitos.
fuente
Después de mucha búsqueda, este código me funciona:
Verifique que el permiso ya tenga: Verifique el permiso WRITE_EXTERNAL_STORAGE ¿Permitido o no?
Implemente el método Override onRequestPermissionsResult para verificar si el usuario permite o deniega
fuente
me ha funcionado
fuente
fuente
Antes de comenzar la descarga, verifique los permisos de tiempo de ejecución y, si no tiene permiso, solicite permisos como este método
requestStoragePermission ()
fuente
De una manera simple, el permiso se puede otorgar usando el archivo manifest.xml, pero estuvo bien hasta el nivel 23 de la API sdk versión 6, después de aquí, si queremos obtener el permiso, debemos solicitar el uso para permitir el permiso que son necesarios
Simplemente agregue este código en mainActivity.java
Reemplace la CÁMARA o agregue con WRITE_EXTERNAL_STORAGE si lo desea, y con el código único.
Este es el código simple para obtener permiso.
fuente