05- AndroidQ(10.0) sd卡权限问题 媒体库更新

最近在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();
        }
   }

完成以上,即可在启动时自动更新媒体库。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容