Android studio 请求用户访问未显示的文件的权限
我试图使一个应用程序,用户可以选择一个个人资料图片。单击图片时,会弹出一条消息,要求获得访问设备文件的权限。我运行了代码并按下了“拒绝”,现在“请求权限”窗口不再出现Android studio 请求用户访问未显示的文件的权限,android-studio,Android Studio,我试图使一个应用程序,用户可以选择一个个人资料图片。单击图片时,会弹出一条消息,要求获得访问设备文件的权限。我运行了代码并按下了“拒绝”,现在“请求权限”窗口不再出现 public class profileClass extends AppCompatActivity { CircleImageView regUserPhoto; static int PReqCode = 1; static int REQUESTCODE = 1; Uri pickedIm
public class profileClass extends AppCompatActivity {
CircleImageView regUserPhoto;
static int PReqCode = 1;
static int REQUESTCODE = 1;
Uri pickedImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.profile_activity);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.profile_activity);
regUserPhoto = findViewById(R.id.regUserPhoto);
regUserPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(Build.VERSION.SDK_INT >= 22){
checkAndRequestForPermission();
}else{
openGallery();
}
}
});
}
private void openGallery() {
Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
galleryIntent.setType("image/*");
startActivityForResult(galleryIntent,REQUESTCODE);
}
private void checkAndRequestForPermission() {
if(ContextCompat.checkSelfPermission(profileClass.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
if (ActivityCompat.shouldShowRequestPermissionRationale(profileClass.this, Manifest.permission.READ_EXTERNAL_STORAGE)){
Toast.makeText(profileClass.this,"Please Accept for required permission",Toast.LENGTH_SHORT).show();
}else{
ActivityCompat.requestPermissions((profileClass.this),new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},PReqCode);
}
}else{
openGallery();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode,resultCode,data);
if(resultCode == RESULT_OK && requestCode == REQUESTCODE && data != null ){
pickedImage = data.getData();
regUserPhoto.setImageURI(pickedImage);
}
}
}
我也有同样的问题,我也解决了。为了简化操作,我编写了一个util类来处理运行时权限
public class PermissionUtil {
/*
* Check if version is marshmallow and above.
* Used in deciding to ask runtime permission
* */
public static boolean shouldAskPermission() {
return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M);
}
private static boolean shouldAskPermission(Context context, String permission){
if (shouldAskPermission()) {
int permissionResult = ActivityCompat.checkSelfPermission(context, permission);
if (permissionResult != PackageManager.PERMISSION_GRANTED) {
return true;
}
}
return false;
}
public static void checkPermission(Context context, String permission, PermissionAskListener listener){
/*
* If permission is not granted
* */
if (shouldAskPermission(context, permission)){
/*
* If permission denied previously
* */
if (((Activity) context).shouldShowRequestPermissionRationale(permission)) {
listener.onPermissionPreviouslyDenied();
} else {
/*
* Permission denied or first time requested
* */
if (PreferencesUtil.isFirstTimeAskingPermission(context, permission)) {
PreferencesUtil.firstTimeAskingPermission(context, permission, false);
listener.onPermissionAsk();
} else {
/*
* Handle the feature without permission or ask user to manually allow permission
* */
listener.onPermissionDisabled();
}
}
} else {
listener.onPermissionGranted();
}
}
/*
* Callback on various cases on checking permission
*
* 1. Below M, runtime permission not needed. In that case onPermissionGranted() would be called.
* If permission is already granted, onPermissionGranted() would be called.
*
* 2. Above M, if the permission is being asked first time onPermissionAsk() would be called.
*
* 3. Above M, if the permission is previously asked but not granted, onPermissionPreviouslyDenied()
* would be called.
*
* 4. Above M, if the permission is disabled by device policy or the user checked "Never ask again"
* check box on previous request permission, onPermissionDisabled() would be called.
* */
public interface PermissionAskListener {
/*
* Callback to ask permission
* */
void onPermissionAsk();
/*
* Callback on permission denied
* */
void onPermissionPreviouslyDenied();
/*
* Callback on permission "Never show again" checked and denied
* */
void onPermissionDisabled();
/*
* Callback on permission granted
* */
void onPermissionGranted();
}
}
PreferenceUtil方法如下所示
public static void firstTimeAskingPermission(Context context, String permission, boolean isFirstTime){
SharedPreferences sharedPreference = context.getSharedPreferences(PREFS_FILE_NAME, MODE_PRIVATE;
sharedPreference.edit().putBoolean(permission, isFirstTime).apply();
}
public static boolean isFirstTimeAskingPermission(Context context, String permission){
return context.getSharedPreferences(PREFS_FILE_NAME, MODE_PRIVATE).getBoolean(permission, true);
}
现在,您只需要使用带有适当参数的checkPermission方法
举个例子,
PermissionUtil.checkPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE,
new PermissionUtil.PermissionAskListener() {
@Override
public void onPermissionAsk() {
ActivityCompat.requestPermissions(
thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
REQUEST_EXTERNAL_STORAGE
);
}
@Override
public void onPermissionPreviouslyDenied() {
//show a dialog explaining permission and then request permission
}
@Override
public void onPermissionDisabled() {
Toast.makeText(context, "Permission Disabled.", Toast.LENGTH_SHORT).show();
}
@Override
public void onPermissionGranted() {
readContacts();
}
});
案例1:应用程序没有权限,并且用户尚未访问
我以前请求过许可。在这种情况下,,
shouldShowRequestPermissionRegulation()将返回false,因为
这是我们第一次询问用户
案例2:用户拒绝了权限并选择了“不询问”
同样”,在这种情况下,也应该显示RequestPermissionRegulation()将
返回false
在案例2中,我想将用户发送到应用程序的设置页面。
我如何区分这两种情况
对于案例1,您将收到onPermissionAsk的回调,对于案例2,您将收到onPermissionDisabled的回调
快乐编码:)