NotificationManager崩溃只在设备 [英] NotificationManager crashes only on device
问题描述
我有我无法解释的问题。我有一个包含一个按钮,主要活动。当点击这个按钮,它会启动一个新的活动,它从互联网下载的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 ...更多
在较老的Android版本,你的通知
曾有内容的意图,从而当用户点击您通知,事的发生。这意味着您必须:
请在意图
的对象,指向的地方,比如你的 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屋!