ACTION_OPEN_DOCUMENT
是 Android 中的一个 Intent 动作,用于打开文件选择器,让用户选择一个或多个文件。这个动作允许应用请求访问用户选择的文件,而不需要知道文件的存储位置或路径。返回的 Uri 是一个内容 Uri,它指向用户选择的文件。
ACTION_OPEN_DOCUMENT
可以避免直接访问文件系统,从而减少权限需求。问题描述:使用 ACTION_OPEN_DOCUMENT
后,返回的 Uri 是无效的,导致无法访问文件。
原因:
解决方法:
AndroidManifest.xml
中声明了读取文件的权限,并在运行时请求权限。AndroidManifest.xml
中声明了读取文件的权限,并在运行时请求权限。ContentResolver
验证 Uri 是否有效。ContentResolver
验证 Uri 是否有效。以下是一个完整的示例,展示了如何使用 ACTION_OPEN_DOCUMENT
并处理返回的 Uri。
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CODE = 123;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_open_document).setOnClickListener(v -> openDocument());
}
private void openDocument() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK && data != null) {
Uri uri = data.getData();
if (uri != null) {
checkUri(uri);
}
}
}
private void checkUri(Uri uri) {
ContentResolver contentResolver = getContentResolver();
try {
InputStream inputStream = contentResolver.openInputStream(uri);
if (inputStream != null) {
// Uri 有效,可以进行文件操作
inputStream.close();
} else {
// Uri 无效
Toast.makeText(this, "Invalid Uri", Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
通过以上步骤,可以有效解决 ACTION_OPEN_DOCUMENT
导致的无效 Uri 问题。
领取专属 10元无门槛券
手把手带您无忧上云