我有一个片段,其中我有recyclerview和设置数据在这个recyclerview使用recyclerview适配器。
现在,我在适配器的列表项中有一个按钮,点击它,我需要检查android中的READ_EXTERNAL_STORAGE权限,以获得android中的新权限模型。
我在这个适配器的片段中创建了一个新函数,以检查是否授予权限,如果没有授予,则请求权限。
我已经通过了MyFragment。这作为适配器中的一个参数,并在适配器中的按钮单击上调用片段的方法。
我已经使用下面的代码在片段中调用requestPermission。
if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
ConstantVariables.READ_EXTERNAL_STORAGE);
}
我用下面的代码重写了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, proceed to the normal flow.
startImageUploading();
} else {}
但是它没有被调用,而不是这个Activity的onRequestPermissionsResult方法被调用。
我在片段的父活动中也定义了相同的onRequestPermissionsResult方法,它正在被调用。
我不能删除活动的onRequestPermissionsResult方法,但想调用片段的onRequestPermissionsResult方法时,我请求从片段的权限。
我该怎么做呢?我做错了什么吗,如果有人有什么想法,请帮助我。
这是人们在为“棉花糖”编程时常犯的一个错误。
当在AppCompatActivity中,你应该使用
ActivityCompat.requestPermissions;在
android.support.v4.app。片段,你应该简单地使用
requestPermissions(这是android.support.v4.app.Fragment的实例方法
ActivityCompat。requestPermissions in a fragment, the
onRequestPermissionsResult回调在活动上被调用,而不是
的片段。
requestPermissions(permissions, PERMISSIONS_CODE);
如果你从一个片段中调用这段代码,它有自己的requestPermissions方法。
基本概念是,如果你在一个活动中,那么调用
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
如果是碎片,就打电话
requestPermissions(new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
作为参考,我从这个链接https://www.coderzheaven.com/2016/10/12/onrequestpermissionsresult-not-called-on-fragments/中获得了答案
这个公认的答案对我来说并不适用,所以我找到了自己的解决方案,解释如下:
1.首先,我创建了一个方法,在片段:
public static void MyOnRequestPermissionResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
if (requestCode == 1 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "Permission: true");
} else {
Log.d(TAG, "permission: false");
}
}
2.然后从它的潜在活动来称呼它:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if(requestCode ==1){
SignupFragment.MyOnRequestPermissionResult(requestCode, permissions, grantResults);
}
}
而且它正在起作用……
这是人们在为“棉花糖”编程时常犯的一个错误。
当在AppCompatActivity中,你应该使用
ActivityCompat.requestPermissions;在
android.support.v4.app。片段,你应该简单地使用
requestPermissions(这是android.support.v4.app.Fragment的实例方法
ActivityCompat。requestPermissions in a fragment, the
onRequestPermissionsResult回调在活动上被调用,而不是
的片段。
requestPermissions(permissions, PERMISSIONS_CODE);
如果你从一个片段中调用这段代码,它有自己的requestPermissions方法。
基本概念是,如果你在一个活动中,那么调用
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
如果是碎片,就打电话
requestPermissions(new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
作为参考,我从这个链接https://www.coderzheaven.com/2016/10/12/onrequestpermissionsresult-not-called-on-fragments/中获得了答案