如何在Android(Android 13)上获得存储访问权限?

cyej8jka  于 2024-01-04  发布在  Android
关注(0)|答案(1)|浏览(453)

我在运行应用程序时遇到了一个问题;它应该在开始时显示一个alert/选项来请求访问存储的权限,但当我运行它时,它没有出现。
我的MainApp.java:

  1. package com.example.thesymphony;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import androidx.core.app.ActivityCompat;
  4. import androidx.core.content.ContextCompat;
  5. import androidx.recyclerview.widget.LinearLayoutManager;
  6. import androidx.recyclerview.widget.RecyclerView;
  7. import android.content.pm.PackageManager;
  8. import android.database.Cursor;
  9. import android.os.Bundle;
  10. import android.provider.MediaStore;
  11. import android.widget.ArrayAdapter;
  12. import android.widget.ListView;
  13. import java.io.File;
  14. import java.util.ArrayList;
  15. import android.Manifest;
  16. import android.widget.TextView;
  17. import android.widget.Toast;
  18. public class MainApp extends AppCompatActivity {
  19. RecyclerView recyclerView;
  20. TextView textView;
  21. String[] items;
  22. ArrayList<AudioModel> songsList=new ArrayList<>();
  23. @Override protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_main_app);
  26. recyclerView=findViewById(R.id.recylerView);
  27. textView=findViewById(R.id.warning);
  28. if (checkPermission()==false) {
  29. requestPermission();
  30. return;
  31. }
  32. String[] projection = {MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.DURATION};
  33. String selection=MediaStore.Audio.Media.IS_MUSIC + "!=0";
  34. Cursor cursor=getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection, null, null);
  35. while (cursor.moveToNext()){
  36. AudioModel songData=new AudioModel(cursor.getString(1),cursor.getString(0),cursor.getString(2));
  37. if (new File(songData.getPath()).exists()){
  38. songsList.add(songData);}
  39. if (songsList.size()==0){
  40. textView.setVisibility(TextView.VISIBLE);
  41. }else{
  42. recyclerView.setLayoutManager(new LinearLayoutManager(this));
  43. recyclerView.setAdapter(new MusicListAdapter(songsList,getApplicationContext()));
  44. }
  45. }
  46. }
  47. boolean checkPermission() {
  48. int result = ContextCompat.checkSelfPermission(MainApp.this, Manifest.permission.READ_EXTERNAL_STORAGE);
  49. if (result == PackageManager.PERMISSION_GRANTED) {
  50. return true;
  51. } else {
  52. return false;
  53. }
  54. }
  55. void requestPermission() {
  56. if (ActivityCompat.shouldShowRequestPermissionRationale(MainApp.this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
  57. Toast.makeText(MainApp.this, "Write External Storage permission. Please allow this permission in App Settings.", Toast.LENGTH_LONG).show();
  58. }
  59. ActivityCompat.requestPermissions(MainApp.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 123);
  60. }
  61. }

字符串
我的AndroidManifest.xml:

  1. <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.TheSymphony" tools:targetApi="31"> <activity android:name=".MainApp" android:exported="true" android:label="@string/title_activity_main_app" android:theme="@style/Theme.TheSymphony" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity" android:exported="true"> </activity> </application></manifest>


我希望,当我第一次运行应用程序时,出现访问存储的权限请求。

7bsow1i6

7bsow1i61#

您的应用是否针对Android 13(targetSdkVersion 33)?
如果是,则需要使用新的READ_MEDIA_IMAGESREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO权限。
参见:https://developer.android.com/about/versions/13/behavior-changes-13#granular-media-permissions

相关问题