android 多媒体数据刷新和操作,以及错误排查

本文详细介绍了在Android系统中如何利用多媒体数据库进行文件的管理和同步,包括使用adb命令刷新数据库、发送广播实现文件扫描以及MediaScannerConnection的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

android中的所有文件的维护和管理都是通过系统的多媒体数据库,这对于提升速度和用户提验十分有用,应用的所有的文件尽量从数据库中获取,频繁的IO操作既会带来同步,异步错误,又会降低运行的速度。

对数据库文件操作,必然关系到数据的同步,同步是否成功,可以使用adb shell content query --uri content://media/external/video/media查询数据库确认,也可以使用adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/命令行刷新数据库


adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/photos/1588754522340video.mp4
adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/photos/1588754522340video.mp4
adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_DIR -d file:///sdcard/photos/


adb shell content query --uri content://media/external/video/media | grep "/16/photos"

 同步有个坑,传输的文件路径是必须使用Environment.getExternalStorageDirectory().getAbsolutePath()获取的动态路径,而不是/sdcard/photos/1588754522340video.mp4,还有另一种同步方案是这个,MediaScannerConnection.scanFile,这个不区别路径,可以使用/sdcard/photos/1588754522340video.mp4,广播支持文件夹同步,各有千秋,根据场景择合适的用之。

public class SyncMedia {
    public static final String TAG = SyncMedia.class.getSimpleName();
    public static final String ACTION_MEDIA_SCANNER_SCAN_DIR = "android.intent.action.MEDIA_SCANNER_SCAN_DIR";

    public static void scanSdCard(Context context, String filePath){
        //path必须是这种Environment.getExternalStorageDirectory().getAbsolutePath()+"/photos/1588754522340video.mp4"
        context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(filePath))));
    }

    private static ScanSdReceiver scanSdReceiver = new ScanSdReceiver();
    public static void registerScanSdcard(){
        IntentFilter intentfilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);
        intentfilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
        intentfilter.addDataScheme("file");
        AppUtil.getContext().registerReceiver(scanSdReceiver, intentfilter);
    }
    public static void unregisterScanSdcard(){
        AppUtil.getContext().unregisterReceiver(scanSdReceiver);
    }

    public static class ScanSdReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            LogUtil.d(TAG, "action = "+action);
            if (Intent.ACTION_MEDIA_SCANNER_STARTED.equals(action)){
                LogUtil.d(TAG, "action = "+ "ACTION_MEDIA_SCANNER_STARTED");
            }else if(Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)){
                LogUtil.d(TAG, "action = "+ "ACTION_MEDIA_SCANNER_STARTED");
            }
        }
    }

    @SuppressLint("NewApi")
    public static void mediaScan(final Activity context, File file) {
        MediaScannerConnection.scanFile(context,
                new String[] { file.getAbsolutePath() }, null,
                new MediaScannerConnection.OnScanCompletedListener() {
                    @Override
                    public void onScanCompleted(final String path, Uri uri) {
                        Log.v("MediaScanWork", "file " + path
                                + " was scanned seccessfully: " + uri);
                        context.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(context, "onScanCompleted"+path, Toast.LENGTH_LONG).show();
                                //Toast.makeText(context, "onScanCompleted", Toast.LENGTH_LONG).show();
                            }
                        });

                    }
                });
    }
}

 

 

参考:

https://blog.csdn.net/feiyangbahu1/article/details/70238211

http://wossoneri.github.io/2016/10/15/[Android]Multimedia-database/

https://www.jianshu.com/p/90832a323221

Camera ISO、快门、光圈、曝光这几个概念

https://blog.csdn.net/armwind/article/details/52413177

### 实现微信朋友圈功能的关键要素 在 Android 平台上开发类似微信朋友圈的功能涉及多个方面,包括但不限于图片选择器、网络请求处理以及数据存储等。 #### 图片选择与上传 为了允许用户从本地相册选取照片并上传至服务器,在代码层面可以创建 `PhotoPickerIntent` 对象来启动系统自带的照片选择界面: ```java // 创建意图用于打开图片选择器 PhotoPickerIntent intent = new PhotoPickerIntent(activity); intent.setSelectLimit(9); // 设置最多可选图片数量为9张 activity.startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE); // 启动活动等待返回结果 ``` 当用户完成图片挑选后,应用程序需重写 `onActivityResult()` 方法以便接收所选图像文件路径列表,并进一步执行压缩或直接上传操作[^1]。 #### 动态发布流程设计 考虑到用户体验的一致性交互逻辑的合理性,建议按照如下思路规划整个动态发布的前后端协作机制: - 前端页面布局应简洁明了,提供必要的输入框让用户填写文字描述; - 提交按钮触发时先验证表单合法性再发起异步HTTP POST 请求向服务端传送多媒体资源及其关联信息; - 成功响应则刷新当前视图显示最新一条记录;失败情况下给出提示告知错误原因便于排查问题所在。 #### 数据持久化方案考量 针对已发表的内容保存策略可以选择 SQLite 或者 Room 这样的轻量级关系型数据库框架来进行管理。通过定义实体类映射到表格结构从而简化CRUD (Create Read Update Delete) 操作过程中的编码工作量。与此同时还要考虑同步云端备份以防止单机故障造成的数据丢失风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值