NotificationManager崩溃只在设备 [英] NotificationManager crashes only on device

查看:76
本文介绍了NotificationManager崩溃只在设备的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我无法解释的问题。我有一个包含一个按钮,主要活动。当点击这个按钮,它会启动一个新的活动,它从互联网下载的XML文件。同时下载有一个通知,指示下载进度。

这完全在我的AVD(API 17级)。但是,当我尝试做同样的事情在我的设备(GT-I1900与API级别10,Android版本2.3.3),它崩溃。

我认为,与存在问题的 notificationBuilder ,我使用。

 上下文语境= getApplicationContext();
notificationManager =(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationBuilder =新NotificationCompat.Builder(本);
notificationBuilder.setContentTitle(下载进度)setContentText(下载)setSmallIcon(android.R.drawable.stat_sys_download)。
 

...

  notificationManager.notify(0,notificationBuilder.build());
 

有关下载我用DownloadFilesTask(延伸AsyncTask的),我已经测试和工程罚款。

下面是异常日志:

 在android.app.NotificationManager.notify(NotificationManager.java:91)
 

所以我的问题是:如果问题存在,做我的设备的API级别,任何人都可以解释如何使用通知建设者较低的API

下面是完整的日志:

  02-01 23:06:28.862:E / AndroidRuntime(16860):致命异常:AsyncTask的#1
02-01 23:06:28.862:E / AndroidRuntime(16860):java.lang.RuntimeException的:执行doInBackground时出错()
02-01 23:06:28.862:E / AndroidRuntime(16860):在android.os.AsyncTask $ 3.done(AsyncTask.java:200)
02-01 23:06:28.862:E / AndroidRuntime(16860):在java.util.concurrent.FutureTask中$ Sync.innerSetException(FutureTask.java:274)
02-01 23:06:28.862:E / AndroidRuntime(16860):在java.util.concurrent.FutureTask.setException(FutureTask.java:125)
02-01 23:06:28.862:E / AndroidRuntime(16860):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:308)
02-01 23:06:28.862:E / AndroidRuntime(16860):在java.util.concurrent.FutureTask.run(FutureTask.java:138)
02-01 23:06:28.862:E / AndroidRuntime(16860):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
02-01 23:06:28.862:E / AndroidRuntime(16860):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:581)
02-01 23:06:28.862:E / AndroidRuntime(16860):在java.lang.Thread.run(Thread.java:1019)
02-01 23:06:28.862:E / AndroidRuntime(16860):java.lang.IllegalArgumentException异常:产生的原因需要contentIntent:PKG = com.bakoproductions.easybet ID = 0通知=通知(振动= NULL,声音= NULL,默认值=为0x0,旗帜=为0x0)
02-01 23:06:28.862:E / AndroidRuntime(16860):在android.os.Parcel.readException(Parcel.java:1326)
02-01 23:06:28.862:E / AndroidRuntime(16860):在android.os.Parcel.readException(Parcel.java:1276)
02-01 23:06:28.862:E / AndroidRuntime(16860):在android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag(INotificationManager.java:322)
02-01 23:06:28.862:E / AndroidRuntime(16860):在android.app.NotificationManager.notify(NotificationManager.java:111)
02-01 23:06:28.862:E / AndroidRuntime(16860):在android.app.NotificationManager.notify(NotificationManager.java:91)
02-01 23:06:28.862:E / AndroidRuntime(16860):在com.bakoproductions.easybet.XMLParser.downloadXML(XMLParser.java:83)
02-01 23:06:28.862:E / AndroidRuntime(16860):在com.bakoproductions.easybet.DownloadFilesTask.doInBackground(DownloadFilesTask.java:24)
02-01 23:06:28.862:E / AndroidRuntime(16860):在com.bakoproductions.easybet.DownloadFilesTask.doInBackground(DownloadFilesTask.java:1)
02-01 23:06:28.862:E / AndroidRuntime(16860):在android.os.AsyncTask $ 2.call(AsyncTask.java:185)
02-01 23:06:28.862:E / AndroidRuntime(16860):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:306)
02-01 23:06:28.862:E / AndroidRuntime(16860):4 ...更多
 

解决方案

在较老的Andr​​oid版本,你的通知 有内容的意图,从而当用户点击您通知,的发生。这意味着您必须:

请在意图的对象,指向的地方,比如你的 MainActivity 。请务必将 Intent.FLAG_ACTIVITY_NEW_TASK 标记。

 意向意图=新的意图(这一点,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 

将其转换为一个PendingIntent

  PendingIntent挂起= PendingIntent.getActivity(此,0,意向,PendingIntent.FLAG_UPDATE_CURRENT);
 

最后,在构建器,通话

  notificationBuilder.setContentIntent(挂起);
 

I have a problem that I can't explain. I have a main activity which contains a button. When this button is clicked, it launches a new activity which downloads an xml file from the internet. While downloading there is a notification that indicates the download progress.

This works perfectly in my AVD (API level 17). But, when I try to do the same thing in my device (GT-I1900 with API level 10, android version 2.3.3) it crashes.

I think that the problem exists with the notificationBuilder that I use.

Context context = getApplicationContext();
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationBuilder = new NotificationCompat.Builder(this);
notificationBuilder.setContentTitle("Download Progress").setContentText("Downloading").setSmallIcon(android.R.drawable.stat_sys_download);

...

notificationManager.notify(0, notificationBuilder.build());

For the download I use a DownloadFilesTask (extends AsyncTask) class which I have tested and works fine.

Here is the exception log:

    at android.app.NotificationManager.notify(NotificationManager.java:91)

So my question is: if the problem do exists with the API level of my device, can anyone explain how to use notification builder for lower APIs.

Here is the full log:

02-01 23:06:28.862: E/AndroidRuntime(16860): FATAL EXCEPTION: AsyncTask #1
02-01 23:06:28.862: E/AndroidRuntime(16860): java.lang.RuntimeException: An error occured while executing doInBackground()
02-01 23:06:28.862: E/AndroidRuntime(16860):    at android.os.AsyncTask$3.done(AsyncTask.java:200)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at java.lang.Thread.run(Thread.java:1019)
02-01 23:06:28.862: E/AndroidRuntime(16860): Caused by: java.lang.IllegalArgumentException: contentIntent required: pkg=com.bakoproductions.easybet id=0 notification=Notification(vibrate=null,sound=null,defaults=0x0,flags=0x0)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at android.os.Parcel.readException(Parcel.java:1326)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at android.os.Parcel.readException(Parcel.java:1276)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag(INotificationManager.java:322)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at android.app.NotificationManager.notify(NotificationManager.java:111)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at android.app.NotificationManager.notify(NotificationManager.java:91)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at com.bakoproductions.easybet.XMLParser.downloadXML(XMLParser.java:83)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at com.bakoproductions.easybet.DownloadFilesTask.doInBackground(DownloadFilesTask.java:24)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at com.bakoproductions.easybet.DownloadFilesTask.doInBackground(DownloadFilesTask.java:1)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
02-01 23:06:28.862: E/AndroidRuntime(16860):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
02-01 23:06:28.862: E/AndroidRuntime(16860):    ... 4 more

解决方案

In older android versions, your Notification has to have a content Intent, so that when the user clicks your Notification, something happens. This means you must:

Make an Intent object, pointing somewhere, such as your MainActivity. Make sure to add the Intent.FLAG_ACTIVITY_NEW_TASK flag.

Intent intent = new Intent (this, MainActivity.class);
intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);

Convert it to a PendingIntent

PendingIntent pend = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Finally, in the builder, call

notificationBuilder.setContentIntent (pend);

这篇关于NotificationManager崩溃只在设备的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆