485 字
2 分钟
Android ContentProvider 使用小计
Android 应用在选取文件时推荐使用 Intent.ACTION_GET_CONTENT
意图,而不是使用应用自己创建的文件选择器并获取读取文件权限。
因为从 Android Marshmallow 开始 Android 权限管理开始变得更加整顿严谨,几个版本以来 Android 解决了权限管理松散的问题。
其实 ContentProvider
并不是什么新事物,在 Android 中一直存在着,但随着权限的明确划分,权限的索取要更加的明确,否则会极大的影响用户体验,这时使用系统给予的机制会更加符合操作逻辑,也可以减少工作量。
下面是一个选取文件的简单使用场景
//需要指定一个 int 来定位返回值final int REQUEST_GET_CONTENT=1
//调用系统文件选择器public void getContent() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(intent, REQUEST_GET_CONTENT);}
//接受 URI@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case REQUEST_GET_CONTENT: Uri uri=data.getData(); break; } }}
之后要读取这个文件的内容只需要调用 getContentResolver().openInputStream(uri)
就可以了
但是!
这里有个问题
这样得不到文件的名字
直到我在 Android 文档里翻了又翻翻了又翻翻了又翻————官方还是很良心的,只是忘了用一下搜索功能。。。。
public String getContentName(Uri uri) { String result = null; if (uri.getScheme().equals("content")) { Cursor cursor = this.getContentResolver().query(uri, null, null, null, null); try { if (cursor != null && cursor.moveToFirst()) { result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); } } finally { cursor.close(); } } if (result == null) { result = uri.getPath(); int cut = result.lastIndexOf('/'); if (cut != -1) { result = result.substring(cut + 1); } } return result;}
文档里直接把这个函数给出来了,就直接拿来放心用就好了
后来搜索相关的东西的时候在 stackoverflow 也发现了这个话题,回答是一样的。
这些基本就是选取文件完全方法了,虽然很水,不过写出来就不容易忘了吧
以上
Android ContentProvider 使用小计
https://npofsi-blog.vercel.app/posts/android-contentresolver-more/