最近在Q上又发现一个问题,在文件传输模式下对SD卡中的视音频文件及照片文件进行新增/删除,图库和音乐播放器列表未及时更新,先开始以为是没有接收广播,后面把文件直接丢进机身后,图库和音乐播放器就更新了,研究了下发现和之前写的相机权限有关,这次就写完整一点,以及在sd卡加文件后顺便更新媒体库。
具体代码如下:
首先一、导包:
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import java.util.ArrayList;
import android.os.Environment;
import android.os.storage.DiskInfo;
import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
import android.os.storage.VolumeInfo;
import java.io.File;
import java.util.List;
import android.media.MediaScannerConnection;
二、判断权限问题:
private StorageManager mStorageManager;
在oncreate中添加判断,
mStorageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
if (ContextCompat.checkSelfPermission(MusicBrowserActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){//没有权限则申请权限
Sdcard();
}else { //有权限直接执行
scanFile(getAvailableExternalVolume().path);
}
编写申请权限代码,
public void Sdcard() {
VolumeInfo externalVolume = getAvailableExternalVolume();
if (externalVolume != null) {
createAccessPermission(externalVolume.path);
}
}
private void createAccessPermission(String path) {
StorageVolume storageVolume = mStorageManager.getStorageVolume(new File(path));
Intent intent = storageVolume.createOpenDocumentTreeIntent();
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
startActivityForResult(intent, 1);
}
private VolumeInfo getAvailableExternalVolume() {
List<VolumeInfo> volumes = mStorageManager.getVolumes();
for (VolumeInfo volume : volumes) {
DiskInfo diskInfo = volume.getDisk();
if (diskInfo != null
&& diskInfo.isAdoptable()
&& volume.isMountedWritable()) {
return volume;
}
}
return null;
}
三、获取权限后,实现媒体库更新:
public void scanFile(String filePath) {
try {
MediaScannerConnection.scanFile(this, new String[]{filePath}, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
android.util.Log.d("--", "Scanned " + path + ":");
android.util.Log.d("--", "-> uri=" + uri);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
完成以上,即可在启动时自动更新媒体库。