对于API为23或更高版本的Android设备,如何在不重新启动应用程序的情况下授予外部存储权限(有点像用户的音乐库在单个会话中上传到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的实例化等)。
谢谢你们。
For Android devices with API 23 or higher, how could I grant external storage permissions without restarting the app (kind of like the user's music library being uploaded to Google Play Music within a single session)? I know this issue has been addressed several times here in SO, but I'm not finding any luck so far.
Here are the permissions in my manifest file:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>MainActivity:
@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. */ }... Because as of now, I'd need to restart the app for the permissions to go through (and MainActivity's instantiations and such) after accepting the permissions from the initial pop-up.
Thanks a bunch.
最满意答案
正如@CommonsWare建议的那样,您可以将所有执行INSTANTIATIONS和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(); }当用户接受/拒绝您的权限请求时,会调用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. } } }As @CommonsWare suggested, you can put all your code which does INSTANTIATIONS AND SUCH in a method like instantiateMyObjects() and call that in the onCreate() like
@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(); }And when user accepts/denies your permission request onRequestPermissionsResult() is called. Don't forget to define MY_PERMISSION_CODE take it as 1 for example.
@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. } } }更多推荐
权限,permissions,app,permission,READ_EXTERNAL_STORAGE,电脑培训,计算机培训,IT培训"/>
发布评论