首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android Studio - Java: ACTION_OPEN_DOCUMENT导致无效的Uri

基础概念

ACTION_OPEN_DOCUMENT 是 Android 中的一个 Intent 动作,用于打开文件选择器,让用户选择一个或多个文件。这个动作允许应用请求访问用户选择的文件,而不需要知道文件的存储位置或路径。返回的 Uri 是一个内容 Uri,它指向用户选择的文件。

相关优势

  1. 权限管理:使用 ACTION_OPEN_DOCUMENT 可以避免直接访问文件系统,从而减少权限需求。
  2. 跨应用共享:通过内容 Uri,可以安全地与其他应用共享文件。
  3. 数据保护:用户可以选择只允许应用读取文件,而不是完全访问文件。

类型

  • 单选:用户只能选择一个文件。
  • 多选:用户可以选择多个文件。

应用场景

  • 文件上传:用户可以从设备中选择一个文件上传到服务器。
  • 图片处理:用户可以选择一张图片进行编辑或处理。
  • 文档阅读:用户可以选择一个文档进行阅读或编辑。

常见问题及解决方法

无效的 Uri

问题描述:使用 ACTION_OPEN_DOCUMENT 后,返回的 Uri 是无效的,导致无法访问文件。

原因

  1. 权限问题:应用没有获取到读取文件的权限。
  2. Uri 解析问题:Uri 格式不正确或无法解析。
  3. 文件不存在:选择的文件已被删除或移动。

解决方法

  1. 检查权限: 确保在 AndroidManifest.xml 中声明了读取文件的权限,并在运行时请求权限。
  2. 检查权限: 确保在 AndroidManifest.xml 中声明了读取文件的权限,并在运行时请求权限。
  3. 请求权限的代码:
  4. 请求权限的代码:
  5. 验证 Uri: 使用 ContentResolver 验证 Uri 是否有效。
  6. 验证 Uri: 使用 ContentResolver 验证 Uri 是否有效。
  7. 处理文件不存在的情况: 在读取文件之前,检查文件是否存在。
  8. 处理文件不存在的情况: 在读取文件之前,检查文件是否存在。

示例代码

以下是一个完整的示例,展示了如何使用 ACTION_OPEN_DOCUMENT 并处理返回的 Uri。

代码语言:txt
复制
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 问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券