Java 请求权限对话框未显示
我正试图请求在Android应用程序上读取外部存储的权限。我的问题是没有显示对话框,因此“onRequestPermissionsResult”也不会被调用。这里有什么我做错的吗?我点击了这个链接: 这是我的密码:Java 请求权限对话框未显示,java,android,android-studio,Java,Android,Android Studio,我正试图请求在Android应用程序上读取外部存储的权限。我的问题是没有显示对话框,因此“onRequestPermissionsResult”也不会被调用。这里有什么我做错的吗?我点击了这个链接: 这是我的密码: public class AccountActivity extends AppCompatActivity { protected TextView changeProfileImgBtn; private static final int SELECTED_PI
public class AccountActivity extends AppCompatActivity {
protected TextView changeProfileImgBtn;
private static final int SELECTED_PICTURE = 1;
private static final int F = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_account);
changeProfileImgBtn = (TextView) findViewById(R.id.accountChangeProfileImgBtn);
changeProfileImgBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ContextCompat.checkSelfPermission(AccountActivity.this,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(AccountActivity.this,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
System.out.println("shouldShowRequestPermissionRationale");
} else {
ActivityCompat.requestPermissions(AccountActivity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
F);
System.out.println("REQUEST");
}
} else {
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, SELECTED_PICTURE);
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String permissions[], @NonNull int[] grantResults) {
System.out.println("onRequestPermissionsResult");
switch (requestCode) {
case F: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
System.out.println("GRANTED");
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, SELECTED_PICTURE);
} else {
System.out.println("DENIED");
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
}
正如您在日志ActivityCompat.requestPermissions(…)中看到的,当打印“请求”时,它被称为“请求权限”。无论我运行的是什么设备,都不会打印“shouldshowRequestPermissionRegulation”。未打印“onRequestPermissionsResult”
D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1
I/System.out: REQUEST
I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@ee9f27b time:106175669
我已将其包含在我的清单文件中:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
非常感谢您的帮助。更新:您的清单中是否有请求的权限?您只能请求清单中的权限
此处的文档:使用该类,该类对所有权限使用公共类
public class Utility1 {
public static class Utility {
public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 123;
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static boolean checkPermission(final Context context)
{
int currentAPIVersion = Build.VERSION.SDK_INT;
if(currentAPIVersion>=android.os.Build.VERSION_CODES.M)
{
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.READ_EXTERNAL_STORAGE)) {
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context);
alertBuilder.setCancelable(true);
alertBuilder.setTitle("Permission necessary");
alertBuilder.setMessage("External storage permission is necessary");
alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}
});
AlertDialog alert = alertBuilder.create();
alert.show();
} else {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}
return false;
} else {
return true;
}
} else {
return true;
}
}
}
boolean result = Utility1.Utility.checkPermission(MainActivity.this);
}
在需要检查权限的mainclass中使用此行
public class Utility1 {
public static class Utility {
public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 123;
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static boolean checkPermission(final Context context)
{
int currentAPIVersion = Build.VERSION.SDK_INT;
if(currentAPIVersion>=android.os.Build.VERSION_CODES.M)
{
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.READ_EXTERNAL_STORAGE)) {
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context);
alertBuilder.setCancelable(true);
alertBuilder.setTitle("Permission necessary");
alertBuilder.setMessage("External storage permission is necessary");
alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}
});
AlertDialog alert = alertBuilder.create();
alert.show();
} else {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}
return false;
} else {
return true;
}
} else {
return true;
}
}
}
boolean result = Utility1.Utility.checkPermission(MainActivity.this);
确保您在
清单
中但在应用程序
部分之外拥有使用权限
。您甚至可以尝试在“应显示理由”块中请求许可,例如:
if (ActivityCompat.shouldShowRequestPermissionRationale(AccountActivity.this,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
ActivityCompat.requestPermissions(AccountActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, F);
}
为了更简单,您可能可以使用一些第三方帮助程序代码,比如我自己的代码:是的,我已经在清单文件中包含了这些代码。现在把它上传到我的帖子:)奇怪,我建议卸载并重新安装,有时会修复一些奇怪的权限问题。另一个尝试是添加。尽管您正在请求读取存储,但似乎Android的某些版本可能存在与该打开相关的问题。非常奇怪,我在清单中也添加了写入外部存储。没有成功…在运行Android 4.1或更高版本的设备上,您可能需要在设置应用程序的开发者选项下启用
保护USB存储
。可能是您的
元素。它位于清单标记和应用程序标记的外部。gradle中的目标sdk是什么?我最终使用了这个。但是用户仍然无法接受应用程序的许可,因此他们必须从设备的设置中接受。谢谢您的帮助。非常奇怪的是,在调用requestPermissions(…)时,请求权限对话框不会出现。所以AlertDialog现在只能工作了。你能分享你的gradle吗?因为在gradle target sdk版本中,最高达23 api,那么这个权限就来了。