0

Android Marshmallowでユーザ定義のカスタム実行時アクセス権をリクエストする方法について、誰かが洞察を伝えることができますか?私は読み取り権限を持っているカスタムコンテンツプロバイダと、カスタムコンテンツプロバイダを使ってデータにアクセスしようとしている別のアプリケーションに取り組んでいます。Android:実行時にカスタム権限を要求する

+0

私はすでに同様の質問に答えています。 [ここ](http://stackoverflow.com/a/40639430/3423932)を参照してください。 – muthuraj

+0

これは古い問題ですが、カスタムアクセス許可の問題の「インストール順序依存関係」に遭遇しました。他のアプリケーションが別の開発者によって開発されたため、「署名」保護などの他のソリューションは使用できませんでした。システム権限と同じようにカスタム権限を要求することができますが、カスタム権限に権限グループと保護レベルが「危険」であることを確認する必要があります。これらの要件の両方を使用すると、システムは実行時許可要求を提供します。 – AChez9

答えて

1

私は個人的には許可ライブラリを使用することをお勧めします。代わりに、大規模な定型コードの彼らが効果的になる傾向があり、コードは非常に正確である

それは私の作品。このPermissionsDispatcher

@RuntimePermissions 
public class MainActivity extends AppCompatActivity { 
    //sepcify permissions here 
    @NeedsPermission(Manifest.permission.CAMERA) 
    void showCamera() { 
     //work after permission is granted 
    } 

    @OnShowRationale({Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS}) 
    void showRationaleForCamera(final PermissionRequest request) { 
     new AlertDialog.Builder(this) 
      .setMessage(R.string.permission_camera_rationale) 
      .setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed()) 
      .setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel()) 
      .show(); 
    } 

    @OnPermissionDenied({Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS}) 
    void showDeniedForCamera() { 
     //works when permissions denied 
     Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show(); 
    } 

    @OnNeverAskAgain({Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS}) 
    void showNeverAskForCamera() { 
     Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

この例をありがとう。カスタム定義のパーミッションを使用する方法の例をいくつか教えてください。 –

+0

もしあなたがread_storageとカメラのような複数の権限を求めているのなら、私は答えを更新することができます。多くの許可を定義できます。 – Vicky

+0

これらはすべて組み込み権限です。私は、ユーザーが許可を定義した例を探しています。ユーザーが定義したユーザー定義のカスタムアクセス権を処理する方法は? –

0

を参照してください。

public class MainActivity extends AppCompatActivity { 
private static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1; 

private boolean checkAndRequestPermissions() { 
    Context context=getApplicationContext(); 
    int locationpermission = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION); 
    int readphonestatepermission = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE); 
    int permissionSendMessage = ContextCompat.checkSelfPermission(context,Manifest.permission.SEND_SMS); 
    int writepermission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    int readexternalstoragepermission = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE); 


    List<String> listPermissionsNeeded = new ArrayList<>(); 

    if (locationpermission != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION); 
    } 

    if (readphonestatepermission != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded.add(Manifest.permission.READ_PHONE_STATE); 
    } 
    if (permissionSendMessage != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded.add(Manifest.permission.SEND_SMS); 
    } 

    if (writepermission != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    } 

    if (readexternalstoragepermission != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE); 
    } 

    if (!listPermissionsNeeded.isEmpty()) { 
     requestPermissions(listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS); 
     return false; 
    } 
    return true; 
} 



@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 


    if (requestCode == REQUEST_ID_MULTIPLE_PERMISSIONS) { 



     if (grantResults.length > 0) { 
      for (int i = 0; i < permissions.length; i++) { 


       if (permissions[i].equals(Manifest.permission.ACCESS_FINE_LOCATION)) { 
        if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { 
         Log.e("msg", "location granted"); 


        } 
       } else if (permissions[i].equals(Manifest.permission.READ_PHONE_STATE)) { 
        if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { 
         Log.e("msg", "read phone state granted"); 


        } 
       } else if (permissions[i].equals(Manifest.permission.SEND_SMS)) { 
        if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { 
         Log.e("msg", "sms granted"); 


        } 

       }else if (permissions[i].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
        if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { 
         Log.e("msg", "write external granted"); 


        } 
       }else if (permissions[i].equals(Manifest.permission.READ_EXTERNAL_STORAGE)) { 
        if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { 
         Log.e("msg", "read external storage granted"); 

         Toast.makeText(SplashActivity.this, "Please Restart the Application....... ", Toast.LENGTH_LONG).show(); 
        } 
       }else if (permissions[i].equals(Manifest.permission.READ_LOGS)) { 
        if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { 
         Log.e("msg", "read logs granted"); 



        } 
       } 


      } 

     } 


    } 
} 
@SuppressLint("NewApi") 
@Override 
protected void onCreate(Bundle v) { 
    // TODO Auto-generated method stub 
    super.onCreate(v); 
    setContentView(R.layout.activity_splash); 


    if (checkAndRequestPermissions()) { 

     Toast.makeText(MainActivity.this, "Granted all permissions", Toast.LENGTH_SHORT).show(); 


    } 
} 
} 
+1

ありがとう@Amol。これは、組み込み権限の例です。ユーザー定義のアクセス許可を扱う例をいくつか教えてください。 –

+1

ありがとうございます。これは@Amol –

関連する問題