DownloadManager.Request.setNotificationVisibility falla con jSecurityException: valor no válido para la visibilidad: 1
Estoy tratando de usar el DownloadManager
para descargar archivos PDF de gran tamaño de mi aplicación. Quiero que se muestren las notificaciones durante la descarga, así como cuando finalice la descarga. Sin embargo establecer la visibilidad causa excepción anterior.
Este error es diferente de este post DownloadManager.Request.setNotificationVisibility falla con jSecurityException: valor no válido para la visibilidad: 2
- Android DownloadManager: La descarga falla, pero COLUMN_REASON sólo devuelve "placeholder"
- DownloadManager envía STATUS_SUCCESSFUL para una descarga fallida
- Descargar archivo a directorio personalizado
- Pause / Resume http conexión descarga
- ¿Cómo configurar un cuerpo de solicitud en el DownloadManager de Android?
El otro mensaje está pidiendo ayuda al establecer la visibilidad en VISIBILITY_HIDDEN
para el que necesita permiso en el manifiesto. Estoy intentando fijar la visibilidad a DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED
como así:
public class DMnotifyTestActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); DownloadManager mgr = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); long downloadID = mgr .enqueue(new DownloadManager.Request(Uri.parse("http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf")) .setNotificationVisibility( DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "hello.pdf") .setDescription("my.test.pack Doc")); }
}
Lo que resulta en este stacktrace:
E/AndroidRuntime(24794): Caused by: java.lang.SecurityException: Invalid value for visibility: 1 E/AndroidRuntime(24794): at android.os.Parcel.readException(Parcel.java:1321) E/AndroidRuntime(24794): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:182) E/AndroidRuntime(24794): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:136) E/AndroidRuntime(24794): at android.content.ContentProviderProxy.insert(ContentProviderNative.java:447) E/AndroidRuntime(24794): at android.content.ContentResolver.insert(ContentResolver.java:721) E/AndroidRuntime(24794): at android.app.DownloadManager.enqueue(DownloadManager.java:877) E/AndroidRuntime(24794): at my.test.pack.DMnotifyTestActivity.onCreate(DMnotifyTestActivity.java:18)
Sin establecer la visibilidad, el código funciona bien. Ya he intentado agregar varios permisos para el manifiesto, pero todavía no ir. Esta es la orientación nivel 11 para panal y hacia arriba. Permisos que he intentado son:
- Android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
- Android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS
- Android.permission.ACCESS_DOWNLOAD_MANAGER
- Android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED
- Android DownloadManager API - abrir el archivo después de descargar?
- Cómo solicitar varias descargas con Download Manager en Android 2.3.3
- El gestor de descargas no reconoce los archivos .mp3
- DownloadManager con pausa manual y reanudar
- DownloadManager doble descarga
- La aplicación no está recibiendo android.intent.action.DOWNLOAD_COMPLETE intención
- Cómo recibir el estado de la intención del gestor de descargas hasta que el éxito de la descarga o no
- Android DownloadManager con el método POST?
Aquí está mi hack para superar este error en las tabletas Honeycomb (Versión: 3.2 o API Level: 13):
Request req = new Request(Uri.parse(url)); if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.HONEYCOMB_MR2) { req.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); } else { req.setNotificationVisibility(Request.VISIBILITY_VISIBLE); }
Ah … la diversión con Android!
Si desea utilizar 'VISIBILITY_HIDDEN', debe agregar este permiso en andoroidManifest.xml
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>
Acabo de enfrentar este error con una aplicación similar (mismo código para dm) a Marc's. Nunca lo encontré durante el desarrollo, y no tengo usuarios Honeycomb. Tengo un código similar al anterior pero para Gingerbread y superior.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); } else { request.setShowRunningNotification(true); }
El "hack" anterior está dirigido a Honeycomb, pero como no tengo usuarios Honeycomb, puedo confirmar que el bug está presente en> 4.0, que son + 80% de mis usuarios. El problema apareció en la consola de desarrollo y no puedo volver a crearlo con mis dispositivos. Actualizará mi respuesta a las condiciones del error cuando los usuarios comiencen a quejarse.
EDITAR:
Me encantan mis usuarios. Tenemos que probar el código con un usuario que tenía este problema. La aplicación se estrelló al iniciar la descarga (que creó la notificación VISIBILITY_VISIBLE_NOTIFY_COMPLETED). De hecho, estaba usando android 4.0.3.
Como arreglar
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE); } else { request.setShowRunningNotification(true); }
Básicamente el mismo que la respuesta anterior, pero podemos confirmar que el problema está presente en api 15, por lo que sólo tiene que hacer el ajuste para afectar a todas las versiones api> 11, y no te preocupes por api 16 y 17 a sufrir el mismo problema