nsaito92 / Frock

0 stars 0 forks source link

アラーム鳴動時、アプリがクラッシュする。 #43

Open nsaito92 opened 3 years ago

nsaito92 commented 3 years ago

概要

12-06 22:20:03.240 4144-6239/? W/ActivityManager: Background start not allowed: service Intent { cmp=com.github.nsaito92.Frock/com.example.naotosaito.clocktest.AlarmServiceObserver } to com.github.nsaito92.Frock/com.example.naotosaito.clocktest.AlarmServiceObserver from pid=21285 uid=10254 pkg=com.github.nsaito92.Frock startFg?=false
12-06 22:20:03.247 21285-21285/com.github.nsaito92.Frock D/AndroidRuntime: Shutting down VM
12-06 22:20:03.260 21285-21285/com.github.nsaito92.Frock E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: com.github.nsaito92.Frock, PID: 21285
                                                                           java.lang.RuntimeException: Unable to start service com.example.naotosaito.clocktest.AlarmService@d7c0772 with Intent { flg=0x4 cmp=com.github.nsaito92.Frock/com.example.naotosaito.clocktest.AlarmService (has extras) }: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.github.nsaito92.Frock/com.example.naotosaito.clocktest.AlarmServiceObserver }: app is in background uid UidRecord{b6cc7f1 u0a254 SVC  idle change:uncached procs:1 seq(0,0,0)}
                                                                               at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3958)
                                                                               at android.app.ActivityThread.access$1800(ActivityThread.java:248)
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1861)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                               at android.os.Looper.loop(Looper.java:216)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:7285)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
                                                                            Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.github.nsaito92.Frock/com.example.naotosaito.clocktest.AlarmServiceObserver }: app is in background uid UidRecord{b6cc7f1 u0a254 SVC  idle change:uncached procs:1 seq(0,0,0)}
                                                                               at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1666)
                                                                               at android.app.ContextImpl.startService(ContextImpl.java:1611)
                                                                               at android.content.ContextWrapper.startService(ContextWrapper.java:677)
                                                                               at com.example.naotosaito.clocktest.AlarmService.onStartCommand(AlarmService.java:52)
                                                                               at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3939)
                                                                               at android.app.ActivityThread.access$1800(ActivityThread.java:248) 
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1861) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:106) 
                                                                               at android.os.Looper.loop(Looper.java:216) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:7285) 
                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                               at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975) 

期待値

対応内容

参考情報

備考

*

nsaito92 commented 3 years ago

該当エラーとしては以下。 https://programming-jissen.com/java-lang-illegalstateexception-not-allowed-to-start-service-intent-app-is-in-background-uid-by-oreo/

nsaito92 commented 3 years ago

Serviceは起動したが、バッグラウンド制限にかかった時のログ。

12-10 12:48:31.720 30798-30798/com.github.nsaito92.Frock D/AlarmService: onCreate
12-10 12:48:31.724 30798-30798/com.github.nsaito92.Frock D/AlarmService: onStartCommand
12-10 12:48:31.800 4144-4165/? W/ActivityManager: Stopping service due to app idle: u0a254 -103ms com.github.nsaito92.Frock/com.example.naotosaito.clocktest.AlarmService
12-10 12:48:31.803 4144-4165/? W/ActivityManager: Stopping service due to app idle: u0a254 -76ms com.github.nsaito92.Frock/com.example.naotosaito.clocktest.AlarmServiceObserver
12-10 12:48:31.810 30798-30798/com.github.nsaito92.Frock D/AlarmService: startForeground
12-10 12:48:31.838 30798-30798/com.github.nsaito92.Frock D/AlarmService: intent.getIntExtra : COLUMN_INDEX_ID = 5
12-10 12:48:31.839 30798-30798/com.github.nsaito92.Frock D/AlarmService: audioPlay
12-10 12:48:31.839 30798-30798/com.github.nsaito92.Frock D/AlarmService: audioSetup
12-10 12:48:31.857 30798-30798/com.github.nsaito92.Frock D/AlarmService: createFileDescriptor
12-10 12:48:31.858 30798-30798/com.github.nsaito92.Frock D/AlarmService: indexID = 5
12-10 12:48:31.889 30798-30798/com.github.nsaito92.Frock D/AlarmService: entity.getmSoundUri() = content://com.android.externalstorage.documents/document/primary%3AAndroid%2Fmedia%2Fcom.Slack%2FNotifications%2FSlack%20-%20Incoming%20call.mp3
12-10 12:48:31.903 30798-30798/com.github.nsaito92.Frock D/AlarmService: fileDescriptor = Local File
12-10 12:48:31.966 30798-30798/com.github.nsaito92.Frock D/AlarmService: read Audio File
12-10 12:48:31.971 30798-30798/com.github.nsaito92.Frock D/AlarmService: audioPlay mediaPlayer.start
12-10 12:48:32.055 30798-30798/com.github.nsaito92.Frock D/AlarmService: onDestroy
12-10 12:48:32.055 30798-30798/com.github.nsaito92.Frock D/AlarmService: audioStop
12-10 12:48:32.146 30798-30798/com.github.nsaito92.Frock D/AlarmService: stopForeground
nsaito92 commented 3 years ago

対応方法

・Context.startForegroundService()メソッドを使う

元々AlarmManagerで起動していた処理なので、無理?

・JobSchedulerを使う

こちらを試す。

nsaito92 commented 3 years ago

#include <stdio.h>
#include <stdlib.h>
#include<string.h>

int main() {
    // ポインタ配列で生成された文字列情報。
    char ***p_List = malloc(sizeof(char*) * 5);
    for(int i=0; i<5; i++) {
        p_List[i] = malloc(sizeof(char*) * 2);  //一つのダブルポインタにつき、二つのchar型ポインタ配列を格納出来る様にする。

        for(int j=0; j<2; j++) {
            p_List[i][j] = malloc(sizeof(char) * 256);  // 一つのchar型文字列用配列につき、256バイト格納出来る様にする。
        }
    }

    // 生成したポインタ配列にデータ格納。
    p_List[0][0] = "A";
    p_List[0][1] = "B";
    p_List[1][0] = "A";
    p_List[1][1] = "C";
    p_List[2][0] = "B";
    p_List[2][1] = "C";
    p_List[3][0] = "B";
    p_List[3][1] = "D";
    p_List[4][0] = "C";
    p_List[4][1] = "E";

    // 1レコードごとのリザルトを格納するポインタ配列。
    char **p_ResultList = malloc(sizeof(char*) * 10);
    for (int i=0; i<10; i++) {
        p_ResultList[i] = malloc(sizeof(char) * 256);
    }

    // 各レコードのデータをコピーした際のインデックスを格納する。
    int *p_checkIndex = malloc(sizeof(int) * 10);

    // 依存関係をチェック、CSVにエクスポート
    for(int i=0; i<5; i++) {        // 右側のカラムをループしてチェックする。
        strcpy(p_ResultList[0], p_List[i][0]);
        strcpy(p_ResultList[1], p_List[i][1]);
        checkColumn = 1;

        for(int j=0; j<5; j++) {    // 左側のカラムをループしてチェックする。
            // printf("p_List[%d][0] = %s , p_List[%d][1] = %s\n ", j, &p_List[j][0][0], i, &p_List[i][1][0]);
            if (strcmp(p_List[j][0], p_ResultList[checkColumn]) == 0) {
                // ポインタ配列末尾にデータ追加。
                strcpy(p_ResultList[checkColumn + 1], p_List[j][1]);
                checkColumn++;
                p_checkIndex[checkColumn] = j;
                j=0;
            }
        }

        // レコードリザルト。
        for (int i=0; i <= checkColumn; i++) {
            printf("p_ResultList[%d] = %s\n ", i, &p_ResultList[i][0]);
        }

        // 次のレコードをチェックする前に、他のパターンのチェックが漏れていないかチェックする。
        int check = checkColumn - 1;
        for(int i=0; i <=check; i++) {
            if (strcmp(p_List[j][0], p_ResultList[check]) == 0) {
                // ポインタ配列末尾にデータ追加。
                strcpy(p_ResultList[check + 1], p_List[j][1]);
                check++;
                j=0;
            }
        }

        // 次のレコード。
        printf("Next\n");
    }
    // チェック終了。

    // ポインタ配列のメモリ全解放。
    for(int i=0; i<5; i++) {
        free(p_List[i]);
    }
    free(p_List);

    // result格納用ポインタ配列のメモリ解放。
    for(int i=0; i<10; i++) {
        free(p_ResultList[i]);
    }
    free(p_ResultList);

    return 0;
}
nsaito92 commented 3 years ago

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int recordFind(char **p_ResultList, char *findValue);

/* 指定された文字列の検索を行う。  */
void find(char ***p_List, char **p_ResultList, char *findValue, int findIndex) {
    printf("### find ###\n");
    // printf("p_List = %p\n", p_List[0][0]);
    // printf("p_List = %s\n", &p_List[0][0][0]);
    // printf("p_List = %p\n", p_List[1][0]);
    // printf("p_List = %s\n", &p_List[1][0][0]);

    // テストデータ挿入。
    p_ResultList[0] = "A";
    p_ResultList[1] = "P";
    p_ResultList[2] = "B";
    int cnt = 3;
    printf("p_ResultList[0] = %s\n", &p_ResultList[0][0]);
    printf("p_ResultList[1] = %s\n", &p_ResultList[1][0]);
    printf("p_ResultList[2] = %s\n", &p_ResultList[2][0]);

    // 渡された文字が、CSVリストに存在しているか、チェックし、存在していればリザルトCSVに格納。
    for(int i=0; i<5; i++) {
        printf("p_List[%d][0] = %s\n", i, &p_List[i][0][0]);

        // 検索する文字と比較。
        if(strcmp(p_List[i][0], findValue) == 0) {
            printf("true\n");
            // 一致している場合、Toの文字列が、リザルト配列内部に格納済みかチェック。
            if(recordFind(p_ResultList, &p_List[i][1][0]) == 0) {
                // 条件に一致した文字列は、リザルトに結果を格納。
                // 次の検索処理。
                printf("insert\n");
            }
        } else {
            printf("false\n");
        }

        // 見つからなかった場合、結果をCSVに出力。
        // 現在の検索位置より、右側の情報を削除。
        // 検索インデックスを左へ。(デクリメント)
        // 検索インデックスが、一番左にきていた場合
            // 処理終了。
        // 一番左ではなかった場合
            // 検索処理を続行。

    }
}

/* 指定された文字列が、リザルト配列に格納済みか否かチエックし、結果を返却する。 */
int recordFind(char **p_ResultList, char *findValue) {
    printf("### recordFind ###\n");
    printf("findValue = %s\n", &findValue[0]);

    int result = 0;

    // リザルト関数に格納されているデータの数だけループし、比較を行う。
    for(int i=0; i<3; i++) {
        if(strcmp(p_ResultList[i], findValue) == 0) {
            printf("trascasue\n");
            result = 1;
            break;
        }
    }
    printf("return = %d\n", result);
    return result;
}

int main() {
    // ポインタ配列で生成された文字列情報。
    char ***p_List = malloc(sizeof(char*) * 5);
    // printf("p_List = %p\n", p_List);

    for(int i=0; i<5; i++) {
        p_List[i] = malloc(sizeof(char*) * 2);  //一つのダブルポインタにつき、二つのchar型ポインタ配列を格納出来る様にする。
        // printf("p_List[%d] = %p\n", i, p_List[i]);

        for(int j=0; j<2; j++) {
            p_List[i][j] = malloc(sizeof(char) * 256);  // 一つのchar型文字列用配列につき、256バイト格納出来る様にする。
            //  printf("p_List[%d][%d] = %p\n", i, j, p_List[i][j]);
        }
    }

    // 生成したポインタ配列にデータ格納。
    p_List[0][0] = "A";
    p_List[0][1] = "B";
    p_List[1][0] = "A";
    p_List[1][1] = "C";
    p_List[2][0] = "B";
    p_List[2][1] = "C";
    p_List[3][0] = "B";
    p_List[3][1] = "D";
    p_List[4][0] = "C";
    p_List[4][1] = "E";

    // 1レコードごとのリザルトを格納するポインタ配列。
    char **p_ResultList = malloc(sizeof(char*) * 10);
    // printf("p_ResultList = %p\n", p_ResultList);
    for (int i=0; i<10; i++) {
        p_ResultList[i] = malloc(sizeof(char) * 256);
        // printf("p_ResultList[%d] = %p\n", i, p_ResultList[i]);
    }

    // 検索したい文字列を入力。
    printf("### 検索したい文字列を入力してください。 ###\n");
    char value[256];
    char *findValue;
    scanf("%s", value);
    // findValue = &(value[0]);
    findValue = value;

    int findIndex = 0;
    // 検索処理を開始する。
    find(p_List, p_ResultList, findValue, findIndex);

    // チェック終了。
    printf("### END ###\n");

    // ポインタ配列のメモリ全解放。
    for(int i=0; i<5; i++) {
        free(p_List[i]);
    }
    free(p_List);

    // result格納用ポインタ配列のメモリ解放。
    free(p_ResultList);

    return 0;
}