2016-08-17 12 views
8

私はXiaomi Redmi 2 PrimeモバイルでBOOT COMPLETEブロードキャストを取得していません。MIUIセキュリティアプリケーションの自動起動パーミッションをプログラムで取得する方法は?

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

今、私は -

マイブロードキャストレシーバは---

public class OnBootReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // Setting singleAlarm 
    SingleAlarmHandler.getInstance().setAlarm(context); 

    try { 
     // Sending System Setting broadcast 
     String offDate = SharedPrefrencesHandler.getInstance(context).readString(SharedPrefrencesConstants.SWITCH_OFF_DATE); 
     int type = SystemSettingsType.PHONE_SWITCH_ON_OFF.getNumericType(); 
     if (offDate == null) 
      offDate = ""; 
     SystemSettingsHandler.getSystemSettingsHandler().makeSystemSettingsCall(context, type, offDate); 
     SharedPrefrencesHandler.getInstance(context).removePrefrence(SharedPrefrencesConstants.SWITCH_OFF_DATE); 
    } catch (Exception e) { 
     Log.e(ChaseForceApplication.TAG, e.getMessage()); 
    } 
} 

}

と権限を持つマニフェストエントリis--

<receiver 
     android:name=".broadcastlisteners.OnBootReceiver" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

ですBOOT COMPLETEブナを取得していない私のXiaomi Redmi 2 Primeモバイルでは、アラームが設定されていないため、キャストしています。しかし、他のアンドロイド携帯では正しく動作しています..

MIUIファームウェアで問題があることが判明しました。このような携帯電話では、セキュリティアプリケーションが組み込まれており、そのセキュリティアプリケーションで自動起動許可を許可するまで、広範なキャスト(通知)はできません。

とすぐにそのアプリでその権限をチェックすると、あなたが放送を取得するために開始..

は今、私の質問は:

MIUIセキュリティアプリの自動起動の許可を取得する方法(RedMiのような携帯電話)プログラム的に?

+1

あなたはどういうことを言っていますか?コードを表示する。 (マニフェスト、あなたのレシーバー) – xdevs23

+0

@ xdevs23、コメントありがとう、今私は自分のコードを追加しました..トーストだけを追加すると、トーストが私のRedmi Prime 2モバイルですが、それはMoto e、Micromax android1などの他の携帯に表示されています。 –

+0

こんにちは@ImranKhanSaifi。 MIUI Romsのセキュリティ機能が追加されました。 Xiaomi電話を使用する開発者(MIUI)はこれについて知っています。私は同じ問題に直面していた。私は多くを検索しましたが、それはMIUIの人は開発者のためのアクセス許可のマネージャーなどのための任意のSDKを与えていないようです。解決策が見つかったら返信してください。 – Mazhar

答えて

7

この質問はすでに2つのスタックオーバーフローのスレッドで答えた:

スレッド#1 https://stackoverflow.com/a/40932178/1537413

String xiaomi = "Xiaomi"; 
final String CALC_PACKAGE_NAME = "com.miui.securitycenter"; 
final String CALC_PACKAGE_ACITIVITY = "com.miui.permcenter.autostart.AutoStartManagementActivity"; 
if (deviceManufacturer.equalsIgnoreCase(xiaomi)) { 
    DisplayUtils.showDialog(activity, "Ask for permission", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 
      try { 
       Intent intent = new Intent(); 
       intent.setComponent(new ComponentName(CALC_PACKAGE_NAME, CALC_PACKAGE_ACITIVITY)); 
       activity.startActivity(intent); 
      } catch (ActivityNotFoundException e) { 
       Logger.e(TAG, "Failed to launch AutoStart Screen ", e); 
      } catch (Exception e) { 
       Logger.e(TAG, "Failed to launch AutoStart Screen ", e); 
      } 
     } 
    }, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 

     } 
    }); 
} 

スレッド#

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 intent = new Intent(); 
      intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")); 
      startActivity(intent); 
     } 

とHuawei社のデバイス上で同様の問題のための2 https://stackoverflow.com/a/41696993/1537413

https://stackoverflow.com/a/35220476/1537413

private void ifHuaweiAlert() { 
    final SharedPreferences settings = getSharedPreferences("ProtectedApps", MODE_PRIVATE); 
    final String saveIfSkip = "skipProtectedAppsMessage"; 
    boolean skipMessage = settings.getBoolean(saveIfSkip, false); 
    if (!skipMessage) { 
     final SharedPreferences.Editor editor = settings.edit(); 
     Intent intent = new Intent(); 
     intent.setClassName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity"); 
     if (isCallable(intent)) { 
      final AppCompatCheckBox dontShowAgain = new AppCompatCheckBox(this); 
      dontShowAgain.setText("Do not show again"); 
      dontShowAgain.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        editor.putBoolean(saveIfSkip, isChecked); 
        editor.apply(); 
       } 
      }); 

      new AlertDialog.Builder(this) 
        .setIcon(android.R.drawable.ic_dialog_alert) 
        .setTitle("Huawei Protected Apps") 
        .setMessage(String.format("%s requires to be enabled in 'Protected Apps' to function properly.%n", getString(R.string.app_name))) 
        .setView(dontShowAgain) 
        .setPositiveButton("Protected Apps", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          huaweiProtectedApps(); 
         } 
        }) 
        .setNegativeButton(android.R.string.cancel, null) 
        .show(); 
     } else { 
      editor.putBoolean(saveIfSkip, true); 
      editor.apply(); 
     } 
    } 
} 

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

private void huaweiProtectedApps() { 
    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); 
     if (userSerial != null) { 
      return String.valueOf(userSerial); 
     } else { 
      return ""; 
     } 
    } catch (NoSuchMethodException | IllegalArgumentException | InvocationTargetException | IllegalAccessException ignored) { 
    } 
    return ""; 
} 
+1

こんにちは@Dika、返信ありがとうございます..私はXiaomiのあなたの自動スタートコードを使用しています、あなたのコードで私はオートスタート設定活動に達することができますが、私は気象ユーザーが自動開始許可を与えられているかどうかを知ることができません。何らかの形でユーザーの行動を知っているかもしれません。気象ユーザーが許可を与えているかどうかは、最終的に許可のステータスです。 –

+1

私が知る限り、ユーザーが許可を与えているかどうかは分かりません。 xiaomiはこの機能を提供しません。あなたが行うことができる最善のことは、チェックリストを使ってユーザーに小さなダイアログを表示することができるということです。「私はすでにこのアプリの自動起動を許可しています。 あなたのお役に立てれば私のコメントに答えを記入してください。 – Dika

-1

xiaomiのビルドセキュリティアプリケーションでアクセス許可を与える必要があります。

  1. はあなたがバックグラウンドで動作しておきたいアプリケーションを有効
  2. を開始autoに行くのセキュリティアプリ
  3. が権限
  4. に行く開きます!

これは私のために働いて..!

+0

これらのステップをプログラムによってどのように行うことができますか。あなたは手動の手順を述べました。 –

関連する問題