关于Android5.0SD卡读写的问题

大家都知道Android5.0对SD卡进行了安全性的升级,再也不能按照传统的方式进行SD卡的读写.

下文详细介绍Android在5.0读写的流程.

第一步,首先需要获得SD卡的权限,要跳转到系统选择SD卡的界面,如果目录获得了权限,那么子目录也获得了权限.这个权限是递归的.

/**
 * 获得SD卡的权限
 */
private void performDirectoryChoose() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    //intent.setFlags(Intent.EXTRA_ALLOW_MULTIPLE);
    startActivityForResult(intent, DIRECTORY_CHOOSE_REQ_CODE);
}
跳转之后我们选择SD卡的根目录.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        Log.d(TAG, "result back");
        Uri treeUri = data.getData();
        getContentResolver().takePersistableUriPermission(treeUri,
                Intent.FLAG_GRANT_READ_URI_PERMISSION |
                        Intent.FLAG_GRANT_WRITE_URI_PERMISSION);//把SD卡的权限保存
        Log.d(TAG, "Uri: " + treeUri.toString());               //否则重启设备权限
        saveUriName(treeUri.toString());                        //需要再次申请
        //for directory choose
        mPickedDir = DocumentFile.fromTreeUri(this, treeUri);

    }
}
第二步,获取文件或者文件夹的URI

因为SD对文件的操作是根据DocumentFile来操作的,而获得DocumentFile需要URI,所以我们得获得文件或者文件夹的URI才能进行文件的各种操作.

我们访问SD卡目录下的Android/data 发现他的URI为

content://com.android.externalstorage.documents/tree/C4B8-C809%3AAndroid/document/C4B8-C809%3AAndroid%2Fdata
而Uri treeUri = data.getData();  uri.ToString()等于ontent://com.android.externalstorage.documents/tree/C4B8-C809%3A

所以根据规律来获取URI就非常简单了,我自己写了一个方法,但是只能获得最多相对SD卡二级目录的URI.因为懒得弄了.想弄更多级别的目录的可以自己拼接uri

 /**
  * @param path 相对SD卡的位置
  * @return
  */
public static String PathToUri(String path,Context mContext){
    Log.d("DocumentFileUtils", path+"length="+path.split("/").length);
    if(path.split("/").length<=1){
        return getUriName(mContext)+path;
    }if(path.split("/").length>1){
        return getUriName(mContext)+path.split("/")[0]+"/document/"+getUriName(mContext).split("tree/")[1]+path.split("/")[0]+"%2F"+path.split("/")[1];
    }

    return "content://com.android.externalstorage.documents/tree/C4B8-C809%3AAndroid/document/C4B8-C809%3AAndroid%2Fdata";
}
获得了uri就可以进行文件的创建删除等操作了,创建和删除的代码为

DocumentFile.fromTreeUri(this,uri).createDirectory("sa");
DocumentsContract.deleteDocument(getContentResolver(), uri);

写的代码为

public static void writeTextFromUri(Uri uri,ArrayList<String> mTexts,Context  mContext) throws IOException {
    OutputStream outputStream = mContext.getContentResolver().openOutputStream(uri);
    BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(outputStream));
    for (String mText : mTexts) {
        bufferedWriter.write(mText+"\t\n");
    }
    bufferedWriter.close();
    outputStream.close();
}
我的QQ121513057有什么不懂的欢迎提问.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值