2012-03-29 5 views
7

Estoy tratando de usar el DownloadManager para descargar archivos PDF grandes de mi aplicación. Quiero que las notificaciones se muestren durante la descarga y también cuando finaliza la descarga. Sin embargo, establecer la visibilidad causa la excepción anterior.DownloadManager.Request.setNotificationVisibility failed with jSecurityException: valor no válido para la visibilidad: 1

Este error es diferente de este post DownloadManager.Request.setNotificationVisibility fails with jSecurityException: invalid value for visibility: 2

El otro puesto está pidiendo ayuda al configurar la visibilidad a VISIBILITY_HIDDEN para el que necesita el permiso en el manifiesto. Estoy tratando de establecer la visibilidad a DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED 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 se traduce 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 del código funciona bien. Ya he intentado agregar varios permisos al manifiesto, pero todavía no voy. Esto apunta al nivel 11, por lo tanto, nido de abeja y arriba. Permisos que he probado son:

  • android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
  • android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS
  • android.permission.ACCESS_DOWNLOAD_MANAGER
  • android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED
+1

Estoy teniendo el mismo problema. ¿Alguien que pueda arrojar algo de luz sobre esto? – dnkoutso

+0

Lamentablemente, este es un error de Android. No hay mucho que pueda hacer al respecto a menos que desee arreglar el código de Google usted mismo. – Marc

Respuesta

3

Aquí es mi truco para superar este error en las tabletas Honeycomb (Versión: 3.2 o Nivel API: 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!

+0

+1, pero debería captar la excepción como esta: 'try {dm.enqueue (request); } catch (SecurityException e) {request.setNotificationVisibility (DownloadManager.Request.VISIBILITY_VISIBLE); dm.enqueue (solicitud); } 'Esto es mejor que el cambio de nivel de API ya que no depende de ninguna información específica sobre plataformas y errores. – caw

0

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 de 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 anterior "piratear" está destinado para Honeycomb, pero como no tengo los usuarios de nido de abeja, puedo confirmar el fallo está presente en> 4,0 que son + 80% de mis usuarios. El problema apareció en la consola de desarrollador, y no puedo volver a crearlo con mis dispositivos. Actualizaré mi respuesta a las condiciones del error cuando los usuarios comiencen a quejarse.

EDIT:

Amo a mis usuarios. Tenemos que probar el código con un usuario que tuvo este problema. La aplicación se bloqueó cuando comenzó la descarga (que creó la notificación VISIBILITY_VISIBLE_NOTIFY_COMPLETED). Él estaba usando Android 4.0.3.

Cómo fijar

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE); 
     } 
    else { 
     request.setShowRunningNotification(true); 
     } 

Básicamente lo mismo que la respuesta anterior, pero podemos confirmar el problema está presente en api 15, por lo que acaba de hacer el ajuste para afectar a todas las versiones de la API> 11, y no se preocupe por api 16 y 17 a sufrir el mismo problema

2

si desea utilizar 'VISIBILITY_HIDDEN', se debe añadir este permiso en andoroidManifest.xml

<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/> 
Cuestiones relacionadas