DownloadManager.Request.setNotificationVisibility завершается ошибкой с jSecurityException: недопустимое значение для видимости: 1 - PullRequest
7 голосов
/ 30 марта 2012

Я пытаюсь использовать DownloadManager для загрузки больших файлов PDF из моего приложения. Я хочу, чтобы уведомления отображались во время загрузки, а также по окончании загрузки. Однако установка видимости вызывает выше исключение.

Эта ошибка отличается от этой записи DownloadManager.Request.setNotificationVisibility завершается ошибкой с jSecurityException: недопустимое значение для видимости: 2

Другой пост просит о помощи при установке видимости на VISIBILITY_HIDDEN, для которого вам нужно разрешение в манифесте. Я пытаюсь установить видимость на DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED примерно так:

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

}

Что приводит к этой трассировке стека:

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)

Без настройки видимости код работает нормально. Я уже пытался добавить различные разрешения в манифест, но все еще не пошел. Это нацеленность на уровень 11, поэтому соты и выше. Разрешения, которые я пробовал:

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

Ответы [ 3 ]

3 голосов
/ 19 января 2013

Вот мой взлом, чтобы преодолеть эту ошибку в сотовых планшетах (версия: 3.2 или уровень 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);
}

Ах ... удовольствие с Android!

2 голосов
/ 17 ноября 2015

если вы хотите использовать 'VISIBILITY_HIDDEN', вы должны добавить это разрешение в andoroidManifest.xml

<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>
0 голосов
/ 26 мая 2013

Я только что столкнулся с этой ошибкой при использовании приложения (с тем же кодом для dm), что и у Марка.Никогда не сталкивался с этим во время разработки, и у меня нет пользователей Honeycomb.У меня есть код, подобный приведенному выше, но для Gingerbread и выше.

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

Предыдущий «хак» предназначен для Honeycomb, но, поскольку у меня нет пользователей Honeycomb, я могу подтвердить, что ошибка присутствует> 4.0, которые составляют + 80% моих пользователей.Проблема появилась на консоли разработчика, и я не могу воссоздать ее на своих устройствах.Обновлю мой ответ на условия ошибки, когда пользователи начнут жаловаться.

РЕДАКТИРОВАТЬ:

Я люблю своих пользователей.Мы должны протестировать код с пользователем, у которого была эта проблема.Приложение рухнуло, когда он начал загрузку (что создало уведомление VISIBILITY_VISIBLE_NOTIFY_COMPLETED).Он действительно использовал Android 4.0.3.

Как исправить

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

По сути то же самое, что и предыдущий ответ, но мы можем подтвердить, что проблема присутствует в API 15, поэтому просто внесите корректировку ввлияет на все версии api> 11, и не беспокойтесь о том, что api 16 и 17 страдают от одной и той же проблемы

...