9

電話の通知をリッスンし、を介して Android Wear ウォッチにメッセージを送信するアプリがありますMessageApi。Android 6 を搭載した一部のデバイス、特に Huawei Mate 8 を除いて、すべて正常に動作します (すべての Huawei Android 6 がこれを行うようです)。

Huawei には、フリーズ アプリのバックグラウンド処理 (保護されたアプリ) の独自の実装があります。ユーザー レポートから、Huawei の保護されたアプリと Android 6 のDozeモードで、私のアプリに例外があることを確認しました。アプリは正常に動作しますが、ディスプレイをオフにしてちょうど 15 分後に、アプリが接続された Android Wear ウォッチへのメッセージの送信を停止します。私のアプリは受信した通知の履歴も記録できますが、15 分経っても何も届きません... 電話のディスプレイがオンになってアプリが開かれるまで。その後、電話のディスプレイがオフのときに到着するはずだったすべての通知がNotificationListenerService実装に到着し、一度に時計に送信されます。これは、記録された履歴でも確認されます。

これらの電話、特に Doze モードの Android 6 を搭載した Huawei Mate 8 でこれを修正する方法はありますか?

NotificationListenerServiceデバイスが居眠りモードにあるときやアプリがスタンバイ モードにあるときの の正しい動作はどれですか?

編集

ユーザーは、バックグラウンド アプリとそのサービスにも影響を与える省電力モードになっていないことも確認しています。Nexusユーザーがこれを報告しておらず、私のOnePlus One with Mもこれを行っていないため、このバグはHuawei専用のようです. また、Nexus デバイスでは N プレビューが適切に機能します。

編集2

オプションのフォアグラウンド サービス ( startForeground()) を追加したので、アプリの通知センターに永続的な通知が表示されるため、すべてのバッテリー最適化からアプリを除外する必要があります。フォアグラウンド サービス通知では、優先度を使用し、フラグNotificationCompat.PRIORITY_MINを追加しました。Notification.FLAG_ONGOING_EVENTこれは Huawei の携帯電話では少し役に立ちましたが、それほどではありませんでした。今ではNotificationListenerService、アプリを開いた後ではなく、画面がオンになった直後に遅延通知が届きます。startForeground()ライフサイクルを制御できないため、自分では使用しませんNotificationListenerServiceが、別の方法では使用Serviceします。

4

2 に答える 2

2

Huawei デバイスの場合 (すべての Huawei デバイスに適用されるかどうかは不明)、アプリがバックグラウンドに入ったときにフリーズしないように、保護されたアプリのアクセス許可を要求する必要があります。

Huawei デバイスに保護されたアプリのアクセス許可があるかどうかを検出するには:

private boolean hasProtectedAppsSetting() {
    Intent intent = new Intent();
    intent.setClassName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity");

    List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
            PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

Huawei Protected Apps 設定ページを表示するには:

private void showProtectedAppsSetting() {
    try {
        String cmd = "am start -n com.huawei.systemmanager/.optimize.process.ProtectActivity";
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            cmd += " --user " + getUserSerial();
        }
        Runtime.getRuntime().exec(cmd);
    } catch (IOException ignored) {
    }
}

private String getUserSerial() {
    //noinspection ResourceType
    Object userManager = getSystemService("user");
    if (null == userManager) return "";

    try {
        Method myUserHandleMethod = android.os.Process.class.getMethod("myUserHandle", (Class<?>[]) null);
        Object myUserHandle = myUserHandleMethod.invoke(android.os.Process.class, (Object[]) null);
        Method getSerialNumberForUser = userManager.getClass().getMethod("getSerialNumberForUser", myUserHandle.getClass());
        long userSerial = (Long) getSerialNumberForUser.invoke(userManager, myUserHandle);
        return String.valueOf(userSerial);
    } catch (NoSuchMethodException | IllegalArgumentException | InvocationTargetException | IllegalAccessException ignored) {
    }
    return "";
}

残念ながら、ユーザーがアプリを保護されたアプリとして許可しているかどうかを確認する方法が見つかりませんでした。知ってる人いたら教えてください:)

参照: http://ndroid.info/ldquo_protected_appsrdquo_setting_on_huawei_phones_and_how_to_handle_it

于 2016-06-01T21:52:27.957 に答える