我是android新手。我试图从自定义类授予权限。我有两个接口和一个单例类,比如这个
public interface RequestPermissionsResultInterface
{
void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults);
}
public interface PermissionManagerInterface
{
void onPermissionGranted(String message, int requestCode);
void onPermissionDenied(String message, int requestCode);
}
public class PermissionManager
{
private Activity mActivity;
private static volatile PermissionManagerInterface mManagerInterface;
public static PermissionManager getInstance(Context context)
{
if (mPermissionManager == null)
{
synchronized (PermissionManager.class)
{
if (mPermissionManager == null)
{
mPermissionManager = new PermissionManager(context);
}
}
}
return mPermissionManager;
}
private boolean isReadStorageAllowed()
{
int result = ContextCompat.checkSelfPermission(this.mActivity, Manifest.permission.READ_EXTERNAL_STORAGE);
return ((result == PackageManager.PERMISSION_GRANTED));
}
public RequestPermissionsResultInterface askPermission(
Activity mActivity,
String permissionName,
final PermissionManagerInterface managerInterface,
final int requestCode)
{
boolean isReadExternalStorageAllowed = isReadStorageAllowed();
if(isReadExternalStorageAllowed == false)
{
if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity, permissionName))
{
final AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
builder.setMessage("Please allow all permissions in App Settings for additional functionality.");
builder.setCancelable(false);
builder.setPositiveButton("Allow", new DialogInterface.OnClickListener() {
public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
managerInterface.onPermissionGranted("Permission Granted", requestCode);
}
});
builder.setNegativeButton("Deny", new DialogInterface.OnClickListener() {
public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
managerInterface.onPermissionDenied("Permission Denied", requestCode);
}
});
final AlertDialog alert = builder.create();
alert.show();
}
}
else managerInterface.onPermissionGranted("Permission Already Granted", requestCode);
}
}
以下是我在MainActivity中使用此类的方法
PermissionManager permManager = PermissionManager.getInstance();
permManager.askPermission(
MainActivity.this,
Manifest.permission.READ_EXTERNAL_STORAGE,
mPermissionManagerInterface, // assume this exists
EXTERNAL_STORAGE_PERMISSION_CODE);
再次......它不是持久的。如果我给予许可,那么再次停止并重新启动应用程序....这是再次请求我的许可。可能有什么不对?感谢
答案 0 :(得分:0)
如果你决定采用“自定义”方法,你仍然需要处理某些事情。
shouldShowRequestPermissionRationale
仅在您之前已请求许可且被拒绝时才为真。您似乎正在使用它来显示一个对话框,说“请授予权限”,但实际上并没有要求系统显示权限请求对话框。
实际请求权限的命令是ActivityCompat.requestPermissions
。在您的代码中看不到这一点。除非您确实要求,否则用户无法授予权限。
onRequestPermissionsResult
是您应该呼叫您的界面以表示授予权限的地方。
文档中有完整的说明。
https://developer.android.com/training/permissions/requesting.html
答案 1 :(得分:0)
来自Android文档
注意:当您的应用调用requestPermissions()时,系统会向用户显示标准对话框。您的应用无法配置或更改该对话框。
我试图通过自定义对话框授予权限,该对话框永远不会起作用。这只是问题的一部分。
我没有在自定义对话框代码部分中请求权限(这本来很糟糕,因为我最终显示了2个对话框:标准+我的自定义对话框)。所以我删除了我的自定义对话框并坚持使用标准对话框。
Kudos去了 kuffs ,因为他/她让我朝着正确的方向前进。