我希望通过向我的应用提供权限模型来在应用程序中实现新的marshmallow支持。 现在我在清单文件中给出了以下权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
现在,在一个活动中,我加载了一个片段,其中我有一个recyclerview,并使用recyclerview适配器在此recyclerview中加载数据。
在这个recyclerview适配器列表中,我点击了一个按钮,我需要上述权限。所以,当用户点击这个按钮时,我调用了以下功能。
public void checkForManifestPermission(){
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(mContext,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale((Activity)mContext,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
ActivityCompat.requestPermissions((Activity)mContext,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
ConstantVariables.READ_EXTERNAL_STORAGE);
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions((Activity)mContext,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
ConstantVariables.READ_EXTERNAL_STORAGE);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
}
现在在活动中我已经覆盖了下面的回调方法。
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case ConstantVariables.READ_EXTERNAL_STORAGE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
ConstantVariables.ENABLE_READ_EXTERNAL_STORAGE = true;
} else {
ConstantVariables.ENABLE_READ_EXTERNAL_STORAGE = false;
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
在我调用函数 checkForManifestPermission 的适配器中并检查条件
if(ConstantVariables.ENABLE_READ_EXTERNAL_STORAGE){}
然后只重定向到其他活动。
现在我的问题是在调用onRequestPermissionsResult方法之前执行此条件中编写的代码,我希望如果用户授予权限,那么只有它应该重定向到其他活动。
我如何实现这一点,我希望我的代码等待用户回复批准或拒绝许可,然后再进一步。
非常感谢你的帮助。
答案 0 :(得分:0)
试试这个:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_CODE) {
for (int i = 0; i < permissions.length; i++) {
String permission = permissions[i];
int grantResult = grantResults[i];
if (permission.equals(Manifest.permission.READ_EXTERNAL_STORAGE)) {
if (grantResult == PackageManager.PERMISSION_GRANTED) {
onPPSButtonPress();
} else {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSIONS_CODE);
}
}
}
}
}
注意:如上所述添加您的阅读权限代码。
答案 1 :(得分:0)
您可以在marshmallow中设置以下代码以获取检查权限:
if ((int) Build.VERSION.SDK_INT >= 23) {
if (ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider WRITE_EXTERNAL_STORAGE
if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
} else {
ActivityCompat.requestPermissions(mActivity,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
}
return;
}
}
答案 2 :(得分:0)
我在两个不同的项目中遇到过类似的问题。
在其中一个我只是检查了进入活动的权限。 如果没有给出许可,那么我禁用了按钮。
如果这不实用,那么另一种可能性就是采用正如你所描述的那样的代码,&#34;在你的情况下&#34;并把它放到一个单独的方法。 然后更改checkForManifestPermission()以返回一个关于程序是否已具有所需权限的布尔值。
所以,代码的那部分会读到这样的内容:
private void methodThatNeedsPermission(){
if (checkForManifestPermission())
doTheAction();
}
private void doTheAction(){
---- your code
}
现在,在onRequestPermissionsResult中,如果用户获得了权限,则可以调用相同的方法。所以,它变成了:
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case ConstantVariables.READ_EXTERNAL_STORAGE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
ConstantVariables.ENABLE_READ_EXTERNAL_STORAGE = true;
doTheAction();
} else {
ConstantVariables.ENABLE_READ_EXTERNAL_STORAGE = false;
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}