我正在尝试使用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_AVANCED
下面是我在蜂窝平板电脑(版本:3.2或API级别:13)中克服这个bug的破解方法:
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的乐趣!
如果您想使用'VISIBILITY_HIDDEN',您应该在androidManifest.xml 中添加此权限
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>
我刚刚用一个与Marc类似的应用程序(dm的代码相同)遇到了这个错误。在开发过程中从未遇到过,我也没有Honeycomb用户。我有一个类似于上面的代码,但用于姜饼和上面的代码。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
else {
request.setShowRunningNotification(true);
}
之前的"黑客攻击"是针对蜂窝的,但由于我没有蜂窝用户,我可以确认该漏洞存在于>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会遇到相同的问题