2012-03-29 5 views
7

Ich versuche, die DownloadManager zu verwenden, um große PDF-Dateien von meiner App herunterzuladen. Ich möchte, dass Benachrichtigungen sowohl beim Download als auch beim Download angezeigt werden. Die Einstellung der Sichtbarkeit verursacht jedoch eine Ausnahme.DownloadManager.Request.setNotificationVisibility schlägt mit jSecurityException fehl: ungültiger Wert für Sichtbarkeit: 1

Dieser Fehler unterscheidet sich von diesem Beitrag DownloadManager.Request.setNotificationVisibility fails with jSecurityException: invalid value for visibility: 2

Die andere Stelle ist um Hilfe zu bitten, wenn die Sichtbarkeit zu VISIBILITY_HIDDEN Einstellung für die Sie eine Berechtigung im Manifest müssen. Ich versuche, um die Sichtbarkeit zu DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED wie so einzustellen:

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")); 
} 

}

die in diesem stacktrace Ergebnisse:

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) 

Ohne Sichtbarkeit Einstellung der Code funktioniert einwandfrei. Ich habe bereits versucht, dem Manifest verschiedene Berechtigungen hinzuzufügen, aber immer noch nicht. Dies zielt auf Stufe 11, also wabenartig und hoch. Berechtigungen ich versucht habe, sind:

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

Ich habe das gleiche Problem. Wer kann das beleuchten? – dnkoutso

+0

Leider ist dies ein Android-Fehler. Sie können nicht viel tun, wenn Sie den Code von Google nicht selbst korrigieren möchten. – Marc

Antwort

3

Hier ist mein Hack Um diesen Fehler in Honeycomb Tabletten (Version: 3.2 oder API Level: 13) zu überwinden:

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 ... der Spaß mit Android!

+0

+1, aber Sie sollten die Ausnahme lieber so abfangen: 'try {dm.enqueue (request); } catch (SecurityException e) {request.setNotificationVisibility (DownloadManager.Request.VISIBILITY_VISIBLE); dm.enqueue (Anfrage); } 'Dies ist besser als die API-Ebene wechseln, da es nicht auf bestimmte Informationen über Plattformen und Bugs angewiesen ist. – caw

0

Ich habe gerade diesen Fehler mit einer ähnlichen App (gleicher Code für dm) zu Marc konfrontiert. Nie während der Entwicklung angetroffen, und ich habe keine Honeycomb-Benutzer. Ich habe einen Code ähnlich dem oben genannten, aber für Lebkuchen und darüber.

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

Der bisherige „Hack“ für Honeycomb ausgerichtet ist, aber da ich keine Honeycomb-Nutzer haben, kann ich bestätigen, dass die Fehler in> 4,0 vorhanden ist, die + 80% meiner Benutzer sind. Das Problem ist in der Entwicklerkonsole aufgetreten und ich kann es nicht mit meinen Geräten neu erstellen. Wird meine Antwort auf die Bedingungen für den Fehler aktualisieren, wenn die Benutzer sich beschweren.

EDIT:

ich meine Nutzer lieben. Wir mussten den Code mit einem Benutzer testen, der dieses Problem hatte. Die App stürzte ab, als er den Download startete (der die Benachrichtigung VISIBILITY_VISIBLE_NOTIFY_COMPLETED erstellte). Er benutzte tatsächlich Android 4.0.3.

Wie

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

Grundsätzlich ist das gleiche wie die vorherige Antwort beheben, aber wir können das Problem bestätigen ist in api 15, vorhanden, so nur die Einstellung macht alle Versionen beeinflussen api> 11, und keine Sorge über api 16 und 17 auf der gleichen Ausgabe

2

leiden, wenn Sie ‚VISIBILITY_HIDDEN‘ verwenden möchten, sollten Sie diese Erlaubnis in andoroidManifest.xml hinzufügen

<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/> 
Verwandte Themen