安卓WhatsApp状态保存器开发:SDK权限与查询问题求助
WhatsApp状态保存器开发问题解答
1. SDK 28及以下版本能用ContentResolver.query方法吗?
当然可以。SDK 28及以下还没强制推行分区存储,ContentResolver.query()完全能用,不管是通过MediaStore查询媒体文件,还是配合文件Uri操作都没问题(实际开发里用MediaStore更常见)。
2. SDK 28及以下对应的集合Uri是什么?
如果要查询WhatsApp状态里的图片、视频,常用的集合Uri分两类:
- 图片文件:
MediaStore.Images.Media.EXTERNAL_CONTENT_URI - 视频文件:
MediaStore.Video.Media.EXTERNAL_CONTENT_URI
查询时可以加筛选条件锁定WhatsApp状态的默认文件夹(Android/media/com.whatsapp/WhatsApp/Media/.Statuses/),代码示例如下:
String selection = MediaStore.MediaColumns.DATA + " LIKE ?"; String[] selectionArgs = new String[]{"%WhatsApp/Media/.Statuses/%"}; Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, null);
3. 怎么获取Android/WhatsApp/文件夹的持久化权限?
SDK 28及以下不用像高版本那样折腾存储访问框架(SAF),只要申请READ_EXTERNAL_STORAGE权限就行:
- 先在
AndroidManifest.xml里声明权限:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> - 然后在代码里动态申请(SDK 23及以上必须动态申请):
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_STORAGE); }
用户授予权限后,只要没手动去系统设置里撤销,这个权限就一直有效,你可以直接访问Android/WhatsApp/下的所有文件。
另外提一句你之前遇到的筛选后还返回MP4的问题:如果MediaStore的筛选条件没起作用,大概率是路径匹配的问题,得确认MediaColumns.DATA对应的路径和目标文件夹是否完全匹配;或者也可以在查询后,通过Cursor获取文件的MIME类型或后缀名再手动过滤,比如只保留image/jpeg、image/png这类图片类型的文件。
内容的提问来源于stack exchange,提问作者Perfect One
相关产品推荐
相关产品推荐

