2016-09-13 16 views
2
int permissionCheck = ContextCompat.checkSelfPermission(mActivity, Manifest.permission.RECEIVE_SMS); 

ActivityCompat.requestPermissions(this, 
      new String[]{Manifest.permission.READ_CONTACTS}, 
      PERMISSION_REQUEST_CODE); 

Log.d(TAG, permissionCheck + ""); 

権限チェックは常にPERMISSION_GRANTEDを返しますが、OS(MIUI)でアプリが権限を持っていません。Miui pre - Marshmallowの許可を求める方法は?

試験デバイス:Redmi注私は、このようなアプローチを使用しているいくつかのアクセス権3のPro(MIUI 8)

+0

ですので、使用しないでください。 – Vyacheslav

+0

これを試してみてください[許可](http://stackoverflow.com/a/39263191/3960700) – Steve

+0

私のコードを見て – Vyacheslav

答えて

0

:以下について

private boolean permissionsActivated = (Build.VERSION.SDK_INT < Build.VERSION_CODES.M); 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
//.... 
     requirepermissionsifneeded(); 
//.... 
    } 

    @SuppressLint("NewApi") 
     private void requirepermissionsifneeded() { 
      // TODO Auto-generated method stub 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       if (!canAll()) { 
        permissionsActivated = false; 
        requestPermissions(INITIAL_PERMS, REQUESTPERM); 
       } 

else { 
permissionsActivated = true; 
} 
      } else { 
       permissionsActivated = true; 
      } 
     } 


@SuppressLint("NewApi") 
    private boolean hasPermission(String perm) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      return (PackageManager.PERMISSION_GRANTED == checkSelfPermission(perm)); 
     } else { 
      return true; 
     } 
     } 
private boolean canAll() { 
     // TODO Auto-generated method stub 
     return (canAccessLocation() && canCoarseLocation() && canGetAccounts()); 
    } 
    private boolean canAccessLocation() { 
     return hasPermission(android.Manifest.permission.ACCESS_FINE_LOCATION); 
    } 
    private boolean canCoarseLocation() { 
     return hasPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION); 
    } 
    private boolean canGetAccounts() { 
     return hasPermission(android.Manifest.permission.GET_ACCOUNTS); 
    } 
    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     // TODO Auto-generated method stub 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     switch (requestCode) { 
      case REQUESTPERM: { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        permissionsActivated = true; 
       } else { 
        // permission denied, boo! Disable the 
        // functionality that depends on this permission. 
        Toast.makeText(this, ":(", Toast.LENGTH_LONG).show(); 
        permissionsActivated = false; 
       } 
      return; 
      } 
      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 

どこコードで

permissionsActivated = canAll();

-2

API 23では、通常、アプリケーションではマニフェストで宣言されているすべての権限があると仮定しています.Xiaomiは例外の1つです。あなたは何ができるか

は、try catchブロックで、あなたのコードを配置し、あなたがスローされた例外を使用してシナリオを特定することができるかどうかを確認します。

私は、このようなデバイスを持っていないので、これをテストすることはできません。私の推測では、それはSecurityExceptionを投げるでしょう。 SMSの許可を受けるために

しかし、私はあなたがこれを行うことができないと思います。代わりに、インストール時にユーザーに許可を無効にしないよう通知します。または、ユーザーにデフォルトのSMSアプリケーションを作成するよう依頼することもできます。

試してみてください!あなたが別のway.Youでアクセス許可を依頼する必要がありMIUIで

+0

これはMIUIデバイスでは動作しません –

+0

@PrinceChampappilly正確に動作しないのは何ですか? MiUi権限アプリをチェックしてアクセスを有効にしましたか? –

+0

彼はプログラム的にRECIEVE_SMSの許可要求を呼び出すか、MIUIのインストール時に自動付与するかについて質問しています。あなたのアプローチはMIUI以外の電話機でのみ動作します。 READ_CONTACTSは正常ですが、RECIEVE_SMSとREAD_SMSは、ほとんどのAUTO GENERATEDメッセージがMIUIによってSERVICE_SMSとしてマークされ、そのアクセス許可がAPPSに付与されていないため、プログラムによって要求できません。すべての権限は、セキュリティページまたはAPP権限ページから付与することができます。 –

0

許可モードを確認する必要がゼロかないに等しいです。上記マシュマロのリードSMS許可

private boolean checkUsagePermission() { 
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { 
    AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE); 
    int mode = 0; 
    mode = appOps.checkOpNoThrow("android:read_sms", android.os.Process.myUid(), getPackageName()); 
    boolean granted = mode == AppOpsManager.MODE_ALLOWED; 
    if (!granted) { 
     //write your code for accept that permission 
     return false; 
    } 
} 
return true; 
} 

ため チェックこの機能を使用するには、あなたのアンドロイドスタジオでAppOpsManagerクラスを見てみたら。

関連する問題