如何修复应用程序在 Android Studio 中停止?

How do I fix Application Stopped in Android Studio?

当我调试应用程序构建成功,但在我的监控设备上崩溃并收到 "Application Stopped" 通知时。在我的 logcat 中,我发现了两个错误,它们以由...引起的行开头。现在,我的问题是,我不知道如何处理这些错误,所以我修复了我的应用程序。我对 Android 编程还很陌生。

Logcat:

2020-05-07 06:02:51.037 27871-27871/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: net.groupkse.indupendo, PID: 27871
    java.lang.RuntimeException: Unable to start service net.groupkse.indupendo.PlayerService@bdbfc6 with Intent { act=net.groupkse.indupendo.action.startforeground cmp=net.groupkse.indupendo/.PlayerService (has extras) }: java.lang.SecurityException: Permission Denial: startForeground from pid=27871, uid=10172 requires android.permission.FOREGROUND_SERVICE
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3804)
        at android.app.ActivityThread.access00(ActivityThread.java:213)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1731)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6819)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:497)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:912)
     Caused by: java.lang.SecurityException: Permission Denial: startForeground from pid=27871, uid=10172 requires android.permission.FOREGROUND_SERVICE
        at android.os.Parcel.createException(Parcel.java:1950)
        at android.os.Parcel.readException(Parcel.java:1918)
        at android.os.Parcel.readException(Parcel.java:1868)
        at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:5067)
        at android.app.Service.startForeground(Service.java:695)
        at net.groupkse.indupendo.PlayerService.showNotification(PlayerService.java:95)
        at net.groupkse.indupendo.PlayerService.onStartCommand(PlayerService.java:43)
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3785)
        at android.app.ActivityThread.access00(ActivityThread.java:213) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1731) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6819) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:497) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:912) 
     Caused by: android.os.RemoteException: Remote stack trace:
        at com.android.server.am.ActivityManagerService.enforcePermission(ActivityManagerService.java:10030)
        at com.android.server.am.ActiveServices.setServiceForegroundInnerLocked(ActiveServices.java:1268)
        at com.android.server.am.ActiveServices.setServiceForegroundLocked(ActiveServices.java:949)
        at com.android.server.am.ActivityManagerService.setServiceForeground(ActivityManagerService.java:21931)
        at android.app.IActivityManager$Stub.onTransact$setServiceForeground$(IActivityManager.java:10685)
2020-05-07 07:06:27.533 7058-7058/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: net.groupkse.indupendo, PID: 7058
    java.lang.RuntimeException: Unable to start service net.groupkse.indupendo.PlayerService@bdbfc6 with Intent { act=net.groupkse.indupendo.action.startforeground cmp=net.groupkse.indupendo/.PlayerService (has extras) }: java.lang.SecurityException: Permission Denial: startForeground from pid=7058, uid=10172 requires android.permission.FOREGROUND_SERVICE
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3804)
        at android.app.ActivityThread.access00(ActivityThread.java:213)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1731)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6819)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:497)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:912)
     Caused by: java.lang.SecurityException: Permission Denial: startForeground from pid=7058, uid=10172 requires android.permission.FOREGROUND_SERVICE
        at android.os.Parcel.createException(Parcel.java:1950)
        at android.os.Parcel.readException(Parcel.java:1918)
        at android.os.Parcel.readException(Parcel.java:1868)
        at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:5067)
        at android.app.Service.startForeground(Service.java:695)
        at net.groupkse.indupendo.PlayerService.showNotification(PlayerService.java:95)
        at net.groupkse.indupendo.PlayerService.onStartCommand(PlayerService.java:43)
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3785)
        at android.app.ActivityThread.access00(ActivityThread.java:213) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1731) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6819) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:497) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:912) 
     Caused by: android.os.RemoteException: Remote stack trace:

以下是我怀疑错误的两种方法:

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent.getStringExtra("url") != null)
            playStream(intent.getStringExtra("url"));

        if (intent.getAction().equals(Constants.ACTION.STARTFOREGROUND_ACTION)) {
            Log.i("info", "Start foreground service!");
            showNotification();

        } else if (intent.getAction().equals(Constants.ACTION.PREV_ACTION)) {
            Log.i("info", "Prev pressed.");

        } else if (intent.getAction().equals(Constants.ACTION.PLAY_ACTION)) {
            Log.i("info", "Play pressed.");

        } else if (intent.getAction().equals(Constants.ACTION.NEXT_ACTION)) {
            Log.i("info", "Next pressed.");

        } else if (intent.getAction().equals(Constants.ACTION.STOPFOREGROUND_ACTION)) {
            Log.i("info", "Stop foreground received.");
            stopForeground(true);
            stopSelf();
        }

        return START_REDELIVER_INTENT;
    }

和:

 private void showNotification () {
        Intent notificationIntent = new Intent(this, MainActivity.class);
        notificationIntent.setAction(Constants.ACTION.MAIN_ACTION);
        notificationIntent.setFlags((Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK));
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

        Intent previousIntent = new Intent(this, MainActivity.class);
        previousIntent.setAction(Constants.ACTION.PREV_ACTION);
        PendingIntent ppreviousIntent = PendingIntent.getActivity(this, 0, previousIntent, 0);

        Intent playIntent = new Intent(this, MainActivity.class);
        playIntent.setAction(Constants.ACTION.PLAY_ACTION);
        PendingIntent pplayIntent = PendingIntent.getActivity(this, 0, playIntent, 0);

        Intent nextIntent = new Intent(this, MainActivity.class);
        nextIntent.setAction(Constants.ACTION.NEXT_ACTION);
        PendingIntent pnextIntent = PendingIntent.getActivity(this, 0, nextIntent, 0);

        Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_kwacha_coin);

        Notification notification = new NotificationCompat.Builder(this)
                .setContentTitle("Music Player")
                .setTicker("Playing music")
                .setContentText("My song")
                .setSmallIcon(R.drawable.ic_kwacha_coin)
                .setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false))
                .setContentIntent(pendingIntent)
                .setOngoing(true)
                .addAction(android.R.drawable.ic_media_previous, "Previou", ppreviousIntent)
                .addAction(android.R.drawable.ic_media_play, "Play", pplayIntent)
                .addAction(android.R.drawable.ic_media_next, "Next", pnextIntent)
                .build();
        startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE, notification);
    }

注意:我注意到在 Android Studio 中,新作业 "Notification.Builder" 被取消这样的一行打断了;我不知道那是什么意思。

你有这个错误

Caused by: java.lang.SecurityException: Permission Denial: startForeground from pid=27871, uid=10172 requires android.permission.FOREGROUND_SERVICE

这意味着您需要在 Android 清单中添加权限。

<manifest ...>
     ...
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     ...
     <application ...>
     ...
</manifest>

你可以参考这个答案