只要我使用Android模拟器进行测试,我的代码就可以正常工作,但是一旦构建并尝试在手机上使用它,我会收到以下错误消息:
An uncaught Exception occurred on "main" thread.
Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=channel_01 pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x40 color=0x00000000 vis=PRIVATE)
StackTrace:
android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=channel_01 pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x40 color=0x00000000 vis=PRIVATE)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1760)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6806)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
这是我的代码:
@JavaProxy('org.nativescript.nstestandroid.ForegroundService')
class ForegroundService extends android.app.Service {
onStartCommand(intent, flags, startId) {
console.log('onStartCommand');
super.onStartCommand(intent, flags, startId);
return android.app.Service.START_STICKY;
}
onCreate() {
console.log('onCreate')
super.onCreate();
this.startForeground(1, this.getNotification());
}
private getNotification() {
const channel = new android.app.NotificationChannel(
'channel_01',
'ForegroundService Channel',
android.app.NotificationManager.IMPORTANCE_DEFAULT
);
// <const notificationManager = this.getSystemService(android.content.Context.NOTIFICATION_SERVICE) as android.app.NotificationManager;
//notificationManager.createNotificationChannel(channel);
const builder = new android.app.Notification.Builder(this.getApplicationContext(), 'channel_01');
return builder.build();
}
答案 0 :(得分:1)
您需要先创建ID Code
1 A001
2 A002
3 A001
4 A002
5 A001
6 A002
,然后再将其发布到新NotificationChannel
中。像这样:
Notification
您仅创建新的频道(作为对象),但从未调用if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = getString(R.string.channel_name);
String description = getString(R.string.channel_description);
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
channel.setDescription(description);
// Don't see these lines in your code...
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
您可能已经在模拟器上创建了通知通道,但未在设备上创建。某些操作系统版本较低的设备也可能会出于兼容性目的自动创建“默认”通知通道,但较新的操作系统版本可能需要在显示通知之前创建通道
HERE中的一些指南
答案 1 :(得分:1)
像这样创建应用程序类
public class App extends Application {
public static final String CHANNEL_ID = "exampleServiceChannel";
@Override
public void onCreate() {
super.onCreate();
createNotificationChannel();
}
private void createNotificationChannel() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
NotificationChannel serviceChannel = new NotificationChannel(CHANNEL_ID, "Example Service Channel",NotificationManager.IMPORTANCE_DEFAULT);
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(serviceChannel);
}
}
}
在服务类中创建通知并调用startForeground
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,
0, notificationIntent, 0);
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Example Service")
.setContentText(userInput)
.setSmallIcon(R.drawable.ic_android)
.setContentIntent(pendingIntent)
.build();
startForeground(1,notification);
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidservicestemplate">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application
android:name=".App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"></activity>
<service android:name=".ExampleService" />
</application>
</manifest>
答案 2 :(得分:-1)
您需要在清单中注册应用程序类
<application
android:name="App" //like this
android:allowBackup="true"
.....