【问题标题】:Android : Requesting Custom Permission at runtimeAndroid:在运行时请求自定义权限
【发布时间】:2017-03-28 19:57:38
【问题描述】:

谁能提供一些关于如何在 Android Marshmallow 中请求用户定义的自定义运行时权限的见解?我正在开发具有读取权限的自定义内容提供程序,而另一个应用程序正在尝试使用自定义内容提供程序访问数据。

【问题讨论】:

  • 我已经回答了类似的问题。见here。
  • 这是一个较老的问题,但我遇到了自定义权限问题的“安装顺序依赖”问题,并且无法使用其他解决方案,例如“签名”保护,因为其他应用程序是由另一个开发的开发。您应该能够像请求系统权限一样请求自定义权限,但请确保自定义权限同时具有权限组和“危险”保护级别。满足这两个要求,系统将提供运行时权限请求。

标签: android android-contentprovider android-6.0-marshmallow android-permissions user-permissions


【解决方案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();
    }
}

【讨论】:

  • 感谢您的示例。你能给我一些关于如何使用自定义权限的例子吗?
  • 如果您要求多个权限,例如 read_storage 和 camera.. 等,那么我已经更新了我的答案,您可以定义任意数量的权限
  • 这些都是内置权限。我正在寻找用户定义权限的示例。如何处理用户定义的用户自定义权限?
【解决方案2】:

它对我有用。

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();


    }
}
}

【讨论】:

  • 谢谢@Amol。这是内置权限的示例。你能给我一些处理用户定义权限的例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多