最近我必须制作一个应用程序来从设备读取文件,例如照片、视频、音乐等。当我想打开包含下载、图像、音乐或其他文件夹的文件夹时,我的程序无法读取它们。问题是我根本无法访问应用程序之外的任何文件,我不会收到任何错误,例如,如果我想打开“下载”文件夹,然后使用列表获取其中的文件列表() 方法,它返回 null
请帮我解决这个问题。
MainActivity.java
public class MainActivity extends AppCompatActivity {
//private TextView t;
private Button bt;
private File File;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
bt = findViewById(R.id.button);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// val downloadFolder = requireContext().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS
System.out.println("btn_click!");
// String path = Environment.getExternalStorageDirectory().toString();
// System.out.println(path);
// if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0);
// }
File f = new File("sdcard");
String[] s = f.list();
File sdcard = Environment.getExternalStorageDirectory();
//Get the text file
File file = new File(String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)));
String[] text = file.list();
//Read text from file
System.out.println(Arrays.toString(text));
}
// for(int i=0;i < f.length;i++){
// System.out.println(s[i]);
// }
});
}
}
manifect.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- <permission android:name="android.permission.ACCESS_SUPERUSER"-->
<!-- tools:ignore="ReservedSystemPermission" />-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="28"
/>
<application
android:requestLegacyExternalStorage="true"
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.New_proj"
android:protectionLevel="normal"
>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Android 应用程序通常是沙盒的,这意味着任何应用程序只能访问自己的数据除非应用程序特别请求并由用户授予权限。
在您的清单中,您已经有以下行:
uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
该行演示了您的应用如何访问设备上的 SD 卡。查看权限列表以了解您想要请求哪些权限,并根据需要在您的
uses-permission
中添加 manifest.xml
。
当面向 Android 13+ 时,“READ_EXTERNAL_STORAGE”已被弃用(且未授予)。如果您需要写入共享存储,请使用 MediaStore”
从 Android 13 开始,如果您需要查询共享存储上的 MediaStore 或媒体文件或与之交互,您应该使用一个或多个新的存储权限:
- android.permission.READ_MEDIA_IMAGES
- android.permission.READ_MEDIA_VIDEO
- android.permission.READ_MEDIA_AUDIO
您可以使用MANAGE_EXTERNAL_STORAGE,但如果您无法证明对所有文件进行如此广泛的访问的要求是合理的,Google Play将拒绝您的应用程序。相反,请使用上述权限来访问图像、视频和音频。但请记住,您将无权访问其他文件
如果您需要在没有用户操作的情况下持续与自己的文件交互,您可以使用应用程序特定的外部存储访问(Android/data/your-package-name)
或者,如果您想访问所有文件,但用户可以自己选择文件,您可以使用 Android 的文件选择器,并且不需要额外的权限