web-dev-qa-db-ja.com

Android MstartActivityバッテリーの最適化

場所の近くにいる場合にユーザーに警告するアプリを開発しています。もちろん、電話がアイドル状態の場合にもそうする必要があります。 DOZEを使用して、アプリをホワイトリストに登録する必要があることを理解しました。そのためには、 この投稿 のバディの回答のおかげで、アクションリクエストでインテントを開始できることがわかりました。

Intent intent = new Intent();
String packageName = context.getPackageName();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (pm.isIgnoringBatteryOptimizations(packageName))
    intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
else {
    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intent.setData(Uri.parse("package:" + packageName));
}
context.startActivity(intent);

これは簡単すぎるはずです...グーグルはこのアプローチを好まないので、そうすると、アプリはPlayストアから禁止されるべきです...コメントなし... Okしたがって、ユーザーをバッテリー設定に誘導し、アプリをDOZEのホワイトリストに手動で追加する方法が必要です...はい、これは登るのに大きな壁になるはずです...とにかく唯一の方法のようです...今では答えは次のとおりです。この方法で、インテントを使用して電力使用量の概要に移動できます( ありがとうChris ):

Intent powerUsageIntent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
    ResolveInfo resolveInfo = getPackageManager().resolveActivity(powerUsageIntent, 0);
// check that the Battery app exists on this device
    if(resolveInfo != null){
        startActivity(powerUsageIntent);
    }  

しかし、バッテリーの最適化を選択するためのアプリのリストに直接アクセスするにはどうすればよいですか?

答えてくれてありがとう。

8
Ast

バッテリー最適化を選択するためのアプリのリストを開くには、次のコードサンプルを使用できます。

private void openPowerSettings(Context context) {
    Intent intent = new Intent();
    intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
    context.startActivity(intent);
}

<uses-permission Android:name="Android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>権限は必要ないので、Google Playに公開しても問題ありません(詳細については、 this スレッドとこの質問へのコメントを確認してください)。

[〜#〜]注[〜#〜]

この行を追加する

intent.setData(Uri.parse("package:" + mContext.getPackageName()));

クラッシュが発生します "致命的な例外:Android.content.ActivityNotFoundExceptionインテントを処理するアクティビティが見つかりません{act = Android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS dat = package:io.demo.example}"。ユーザーはリストからアプリを見つける必要があります。アプリに直接ジャンプする方法はないようです。

17
Grimmy

以下のコードを試して、[バッテリー最適化設定を無視する]ページを開きます。

private void openPowerSettings() {
    startActivityForResult(new Intent(Android.provider.Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS), 0);
}

マニフェストファイルに追加の権限を追加する必要はありません。

0
mstoic

これは私が使用するものです:

マニフェスト:

    <uses-permission Android:name="Android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
import Android.Manifest
import Android.annotation.SuppressLint
import Android.content.Context
import Android.content.Intent
import Android.content.pm.PackageManager
import Android.net.Uri
import Android.os.Build
import Android.os.PowerManager
import Android.provider.Settings
import androidx.annotation.RequiresPermission
import androidx.core.content.ContextCompat

object PowerSaverHelper {
    enum class WhiteListedInBatteryOptimizations {
        WHITE_LISTED, NOT_WHITE_LISTED, ERROR_GETTING_STATE, IRRELEVANT_OLD_Android_API
    }

    fun getIfAppIsWhiteListedFromBatteryOptimizations(context: Context, packageName: String = context.packageName): WhiteListedInBatteryOptimizations {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return WhiteListedInBatteryOptimizations.IRRELEVANT_OLD_Android_API
        val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager?
                ?: return WhiteListedInBatteryOptimizations.ERROR_GETTING_STATE
        return if (pm.isIgnoringBatteryOptimizations(packageName)) WhiteListedInBatteryOptimizations.WHITE_LISTED else WhiteListedInBatteryOptimizations.NOT_WHITE_LISTED
    }

    //@TargetApi(VERSION_CODES.M)
    @SuppressLint("BatteryLife", "InlinedApi")
    @RequiresPermission(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
    fun prepareIntentForWhiteListingOfBatteryOptimization(context: Context, packageName: String = context.packageName, alsoWhenWhiteListed: Boolean = false): Intent? {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
            return null
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) == PackageManager.PERMISSION_DENIED)
            return null
        val appIsWhiteListedFromPowerSave: WhiteListedInBatteryOptimizations = getIfAppIsWhiteListedFromBatteryOptimizations(context, packageName)
        var intent: Intent? = null
        when (appIsWhiteListedFromPowerSave) {
            WhiteListedInBatteryOptimizations.WHITE_LISTED -> if (alsoWhenWhiteListed) intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS)
            WhiteListedInBatteryOptimizations.NOT_WHITE_LISTED -> intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).setData(Uri.parse("package:$packageName"))
            WhiteListedInBatteryOptimizations.ERROR_GETTING_STATE, WhiteListedInBatteryOptimizations.IRRELEVANT_OLD_Android_API -> {
            }
        }
        return intent
    }
}

例:

PowerSaverHelper.prepareIntentForWhiteListingOfBatteryOptimization(this)?.let { startActivity(it) }

0