在不重启应用程序的情况下授予外部存储权限
Granting external storage permissions without restarting the app
对于 Android 具有 API 23 或更高版本的设备,我如何在不重新启动应用程序的情况下授予外部存储权限(有点像用户的音乐库被上传到 Google Play单个会话中的音乐)?我知道这个问题已在 SO 中多次解决,但到目前为止我还没有找到任何运气。
这是我的清单文件中的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
主要活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
return; // Included here to prevent the app from crashing.
}
}
/**
* CODE HERE FOR INSTANTIATIONS AND SUCH.
*/
}
... 因为截至目前,我需要重新启动应用程序才能获得权限(以及 MainActivity 的实例化等)在 接受来自初始弹出窗口。
非常感谢。
正如@CommonsWare 建议的那样,您可以将执行 INSTANTIATIONS AND SUCH 的所有代码放入 instantiateMyObjects()
之类的方法中,然后在 onCreate()
中调用它喜欢
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSION_CODE);
// Define the constant MY_PERMISSION_CODE.
return; // Included here to prevent the app from crashing.
}
}
instantiateMyObjects();
}
并且当用户 accepts/denies 您的许可请求 onRequestPermissionsResult()
被调用。不要忘记定义 MY_PERMISSION_CODE
例如 1
。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == MY_PERMISSION_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Now you can instantiate your objects.
instantiateMyObjects();
} else {
// User denied it.
}
}
}
对于 Android 具有 API 23 或更高版本的设备,我如何在不重新启动应用程序的情况下授予外部存储权限(有点像用户的音乐库被上传到 Google Play单个会话中的音乐)?我知道这个问题已在 SO 中多次解决,但到目前为止我还没有找到任何运气。
这是我的清单文件中的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
主要活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
return; // Included here to prevent the app from crashing.
}
}
/**
* CODE HERE FOR INSTANTIATIONS AND SUCH.
*/
}
... 因为截至目前,我需要重新启动应用程序才能获得权限(以及 MainActivity 的实例化等)在 接受来自初始弹出窗口。
非常感谢。
正如@CommonsWare 建议的那样,您可以将执行 INSTANTIATIONS AND SUCH 的所有代码放入 instantiateMyObjects()
之类的方法中,然后在 onCreate()
中调用它喜欢
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSION_CODE);
// Define the constant MY_PERMISSION_CODE.
return; // Included here to prevent the app from crashing.
}
}
instantiateMyObjects();
}
并且当用户 accepts/denies 您的许可请求 onRequestPermissionsResult()
被调用。不要忘记定义 MY_PERMISSION_CODE
例如 1
。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == MY_PERMISSION_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Now you can instantiate your objects.
instantiateMyObjects();
} else {
// User denied it.
}
}
}