2012-03-29 13 views
7

Próbuję użyć pliku DownloadManager, aby pobrać duże pliki PDF z mojej aplikacji. Chcę, aby powiadomienia były wyświetlane podczas pobierania, a także po zakończeniu pobierania. Jednak ustawienie widoczności powoduje powyżej wyjątku.DownloadManager.Request.setNotificationVisibility nie działa z jSecurityException: nieprawidłowa wartość dla widoczności: 1

Błąd ten jest inny od tego postu DownloadManager.Request.setNotificationVisibility fails with jSecurityException: invalid value for visibility: 2

Drugi post jest prośbą o pomoc przy ustawianiu widoczność VISIBILITY_HIDDEN dla których konieczne są uprawnienia w manifeście. Próbuję ustawić widoczność DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED tak:

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

}

co skutkuje tym 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) 

Bez ustawienie widoczności kod działa poprawnie. Podjęto już próbę dodania różnych uprawnień do manifestu, ale nadal nie ma go. To jest na poziomie 11, więc plaster miodu i więcej. Uprawnienia próbowałem to:

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

Mam ten sam problem. Ktoś, kto może rzucić trochę światła na to? – dnkoutso

+0

Niestety jest to błąd Androida. Niewiele można z tym zrobić, chyba że sam chcesz naprawić kod Google. – Marc

Odpowiedz

3

Oto mój siekać aby pokonać ten błąd w tabletach Honeycomb (wersja: 3.2 lub poziom 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 ... zabawa z systemem Android!

+0

+1, ale powinieneś raczej złapać wyjątek w następujący sposób: 'try {dm.enqueue (request); } catch (SecurityException e) {request.setNotificationVisibility (DownloadManager.Request.VISIBILITY_VISIBLE); dm.enqueue (żądanie); } 'Jest to lepsze rozwiązanie niż przełącznik poziomu interfejsu API, ponieważ nie polega na żadnych konkretnych informacjach o platformach i błędach. – caw

0

Właśnie spotkałem się z tym błędem z podobną aplikacją (ten sam kod dla dm) do Marca. Nigdy nie natknąłem się na to podczas programowania i nie mam użytkowników Honeycomb. Mam kod podobny do powyższego, ale do Piernika i wyżej.

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

Dotychczasowy „hack” skierowany jest do plastra miodu, ale nie mam żadnych użytkowników plaster miodu, mogę potwierdzić błąd jest obecny w> 4,0, które są + 80% moich użytkowników. Problem pojawił się w konsoli programisty i nie mogę go odtworzyć na moich urządzeniach. Zaktualizuje moją odpowiedź na warunki błędu, gdy użytkownicy zaczną narzekać.

EDIT:

Kocham moich użytkowników. Musimy przetestować kod u użytkownika, który miał ten problem. Aplikacja zawiesiła się po rozpoczęciu pobierania (która utworzyła powiadomienie VISIBILITY_VISIBLE_NOTIFY_COMPLETED). Rzeczywiście korzystał z Androida 4.0.3.

Jak naprawić

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

zasadzie takie same jak w poprzedniej odpowiedzi, ale możemy potwierdzić ten problem występuje w api 15, więc po prostu sprawiają, że korekta dotyczy wszystkich wersji api> 11, a nie martw się o API 16 i 17 cierpieć ten sam problem

2

jeśli chcesz użyć „VISIBILITY_HIDDEN”, należy dodać to uprawnienie w andoroidManifest.xml

<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/> 
Powiązane problemy