在Android 11(R)中,由于隐私保护的增强,应用程序无法直接访问外部存储上的文件路径。相反,您应该使用文件访问框架来在应用程序之间共享文件。
以下是一个简单的示例代码,演示如何在Android 11(R)中通过文件访问框架访问文件路径:
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.util.Log;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final int REQUEST_CODE = 42;
// 创建一个ActivityResultLauncher,用于启动文件选择器
private final ActivityResultLauncher launcher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == RESULT_OK) {
Intent intent = result.getData();
if (intent != null) {
Uri uri = intent.getData();
if (uri != null) {
// 处理所选文件的URI
Log.d(TAG, "Selected file URI: " + uri.toString());
// 在这里执行你的操作,比如读取文件内容等
}
}
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 检查并请求外部存储的读取权限
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE)
!= android.content.pm.PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE);
} else {
openFilePicker();
}
}
// 请求权限的回调方法
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == android.content.pm.PackageManager.PERMISSION_GRANTED) {
openFilePicker();
} else {
// 权限被拒绝,处理错误情况
Log.e(TAG, "Permission denied");
}
}
}
// 打开文件选择器
private void openFilePicker() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("*/*"); // 指定文件类型,可以根据需要更改
intent.addCategory(Intent.CATEGORY_OPENABLE);
launcher.launch(intent);
}
}
上述代码中,首先我们在onCreate()
方法中检查并请求外部存储的读取权限。如果权限已授予,将调用openFilePicker()
方法来打开文件选择器。如果权限被拒绝,可以在onRequestPermissionsResult()
方法中处理错误情况。
打开文件选择器时,我们使用Intent.ACTION_OPEN_DOCUMENT
来指定意图,并使用setType("*/*")
来指定文件类型,可以根据需要更改。然后,我们使用ActivityResultLauncher启动文件选择器,并在回调方法中处理所选文件的URI。
请注意,在访问文件路径之前,您的应用程序还需要申请适当的权限,并在AndroidManifest.xml文件中声明这些权限。
希望以上代码示例对您有所帮助!