【问题标题】:How do I fix Application Stopped in Android Studio? [duplicate]如何修复 Android Studio 中停止的应用程序? [复制]
【发布时间】:2020-08-22 08:46:17
【问题描述】:

当我成功调试应用程序构建,但在我的监控设备上因“应用程序停止”通知而致命地崩溃。在我的 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.access$1700(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.access$1700(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.access$1700(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.access$1700(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”被取消了一条线;我不知道那是什么意思。

【问题讨论】:

    标签: java android android-studio debugging build.gradle


    【解决方案1】:

    你有这个错误

    引起:java.lang.SecurityException:权限拒绝: startForeground from pid=27871, uid=10172 需要 android.permission.FOREGROUND_SERVICE

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

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

    你可以参考这个答案https://stackoverflow.com/a/52382711/10108711

    【讨论】:

    • 非常感谢!它似乎解决了这个问题。但是,我确实有一些未修复的错误如下:在我的回答中...
    • @KlemLloydMwenya 请创建新问题
    • 请不要发布答案只是为了在此处链接或复制其他用户的答案。如果您认为另一个问题已经有解决方案,请将当前问题标记为重复。谢谢!
    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2020-01-09
    • 1970-01-01
    • 2021-01-19
    • 2018-11-22
    相关资源
    最近更新 更多