MIUI 電話でアプリの自動起動許可がオンかオフかをプログラムで確認する必要があります。Facebook と whatsapp では、この権限がデフォルトで有効になっていますが、どうすれば有効にできますか?
10 に答える
今のところ、それは不可能です。
オペレーティング システムの API とカスタマイズに完全に依存しているためです。開発者でさえ XIOMI の公式フォーラムでこれを要求していますが、そこからの応答はありません。
今でもこの質問に対する答えを見つけていますが、何も役に立ちませんでした。
当面は、ルート化された電話でのみ可能です。つまり、スーパーユーザーになってファームウェアをカスタマイズします。しかし、これはユーザーの電話に損害を与える可能性があるため、まったくお勧めできません。
編集1
次のコードを使用して、ユーザーを自動起動許可の設定ページにリダイレクトして、アプリを有効にすることができます
String manufacturer = "xiaomi";
if (manufacturer.equalsIgnoreCase(android.os.Build.MANUFACTURER)) {
//this will open auto start screen where user can enable permission for your app
Intent intent1 = new Intent();
intent1.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"));
startActivity(intent1);
}
EDIT 2
最近、ストックアンドロイド(miuiではない)を搭載したXIOMIのMi A1を使用したため、この電話にはautostart permission
miuiの設定がありません。そのため、このようなデバイスでは機能しないため、ユーザーをそのようなデバイスの設定に移動する際は注意してください。
oppo、vivo、xiomi、letv huawei、honor に 100% 対応
この関数を呼び出すだけです
private void addAutoStartup() {
try {
Intent intent = new Intent();
String manufacturer = android.os.Build.MANUFACTURER;
if ("xiaomi".equalsIgnoreCase(manufacturer)) {
intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"));
} else if ("oppo".equalsIgnoreCase(manufacturer)) {
intent.setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity"));
} else if ("vivo".equalsIgnoreCase(manufacturer)) {
intent.setComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity"));
} else if ("Letv".equalsIgnoreCase(manufacturer)) {
intent.setComponent(new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity"));
} else if ("Honor".equalsIgnoreCase(manufacturer)) {
intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity"));
}
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (list.size() > 0) {
startActivity(intent);
}
} catch (Exception e) {
Log.e("exc" , String.valueOf(e));
}
}
アクセス許可が有効になっているかどうかを確認するには、フォアグラウンド サービスを開始して、実行中かどうかを確認します。
サービス:
class ExtraPermissionStateService: Service() {
companion object {
private var instance: ExtraPermissionStateService? = null
fun isAppCanRunOnBackground(context: Context): Boolean {
val serviceIntent = Intent(context, ExtraPermissionStateService::class.java)
context.startService(serviceIntent)
return instance != null
}
}
override fun onBind(p0: Intent?): IBinder? {
return null
}
override fun onCreate() {
super.onCreate()
instance = this
}
override fun onDestroy() {
super.onDestroy()
instance = null
}
}
あれを呼べ:
ExtraPermissionStateService.isAppCanRunOnBackground(context)
そしてマニフェストを忘れないでください:
<service android:name=".helpers.utils.ExtraPermissionStateService"/>
システム権限の許可と拒否を行う必要があります。
以下はコードです:
private boolean checkPermission(){
int result = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION);
if (result == PackageManager.PERMISSION_GRANTED){
return true;
} else {
return false;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Snackbar.make(view,"Permission Granted, Now you can access location data.",Snackbar.LENGTH_LONG).show();
} else {
Snackbar.make(view,"Permission Denied, You cannot access location data.",Snackbar.LENGTH_LONG).show();
}
break;
}
}