自定义相册中,小米MI Note Pro 调用拍照返回,退出相册

2019-12-03  本文已影响0人  奥创没电了

拍照返回,相册里展示正常,可选中刚拍的,进行下一步操作。退出相册后,在打开相册,发现刚才拍的找不到了,在系统相册中,可以看到刚才拍的。目前是在小米Note pro机型上发现,暂无其他手机验证。多种调试分析后,确定问题就是查询媒体库MediaStore文件,找不到。对照了下知乎开源相册Matisse,运行这个demo是正常的:

https://github.com/zhihu/Matisse

页面挺丑的,不过不影响,用的是查库刷新库。

发现拍完后 onActivityResult 中,获取照片路径后,并没有用到传统的

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));

而是在实现MediaScannerConnection.MediaScannerConnectionClient接口中,使用:

  MediaScannerConnection mMsc,
  mMsc.connect();  
  mMsc.scanFile(mPath,null);
  mMsc.disconnect();

这样的扫描连接类。

经过测试,拍完退出,再进相册,正常了,可能再某些机型上会有略微的延迟数百ms,不太确定,不过不影响。

代码不多,直接附上:

public class SingleMediaScanner implements MediaScannerConnection.MediaScannerConnectionClient {

private MediaScannerConnection mMsc;

private StringmPath;

private ScanListenermListener;

public interface ScanListener {
      void onScanFinish();
}
public SingleMediaScanner(Context context, String mPath, ScanListener mListener) {
    this.mPath = mPath;
    this.mListener = mListener;
    this.mMsc =new MediaScannerConnection(context,this);
    this.mMsc.connect();
}

 @Override public void onMediaScannerConnected() {
        mMsc.scanFile(mPath,null);
}

@Override
 public void onScanCompleted(String mPath, Uri mUri) {
    mMsc.disconnect();
    if (mListener !=null) {
        mListener.onScanFinish();
  }
}

}

使用时 和 sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file))); 一样,都是在拍照完成后,通知刷新媒体库该文件路径:

new SingleMediaScanner(this.getApplicationContext(), path,new SingleMediaScanner.ScanListener() {
      @Override 
      public void onScanFinish() {
      Log.i("SingleMediaScanner","scan finish!");
    }
});

可以直接下一行继续操作。扫描完的回调,一般场景暂时用不到。

上一篇下一篇

猜你喜欢

热点阅读