Android 5.0以上操作外置sdcard(一)

本文介绍 Android 5.0 中访问外置 SD 卡的新方法,包括获取路径、URI,以及如何创建文件并进行读写操作。

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

google在android4.4封闭了操作外置sd卡的功能,业界一片吐槽,so,在android5.0提供了全新的方式去操作外置sdcard。
    1.首先获得外置sdcard的路径:
        extSdcardPath = System.getenv("SECONDARY_STORAGE");

    2.获取uri,防止重复进入documentui界面
   
        if (!TextUtils.isEmpty(extSdcardPath)) {
        String strUri = PreferenceManager.getDefaultSharedPreferences(this).getString(PREF_DEFAULT_URI, null);
        if (TextUtils.isEmpty(strUri)) {
        if (Build.VERSION.SDK_INT >= 19) {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
        startActivityForResult(intent, DOCUMENT_TREE_REQUEST);
        }
        } else {
        Uri uri = Uri.parse(strUri);
        DocumentFile rootDocumentFile = DocumentFile.fromTreeUri(this, uri);
        createFile(rootDocumentFile);
        }
        } 
 3.处理返回结果
       
        if (requestCode == DOCUMENT_TREE_REQUEST && resultCode == RESULT_OK) {
        Uri uri = data.getData();
        final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION |         Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION |         Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        PreferenceManager.getDefaultSharedPreferences(this).edit().putString(PREF_DEFAULT_URI, uri.toString()).commit();
        DocumentFile documentFile = DocumentFile.fromTreeUri(this, uri);
        for (DocumentFile file : documentFile.listFiles()) {
        Log.d(TAG, "Found file " + file.getName() + " with size " + file.length());
        }
        createFile(documentFile);
        } else {
        Toast.makeText(getBaseContext(), "nonono", Toast.LENGTH_SHORT).show();
        } 
 ============================================================================================
 全部代码
package com.bowen.sdddemo;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Build;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.support.v4.provider.DocumentFile;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import static android.R.id.list;

public class MainActivity extends AppCompatActivity {
private static int DOCUMENT_TREE_REQUEST = 1;
public static String ACTION_OPEN_DOCUMENT_TREE_URL = "ACTION_OPEN_DOCUMENT_TREE";
public String extSdcardPath = null;
public Button extSdcardBtn;
final static String PREF_DEFAULT_URI = "pref_default_uri";
List<FileItem> list = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
extSdcardBtn = (Button) findViewById(R.id.button);
extSdcardPath = System.getenv("SECONDARY_STORAGE");
if (TextUtils.isEmpty(extSdcardPath)) {
extSdcardBtn.setVisibility(View.GONE);
} else {
extSdcardBtn.setText(extSdcardPath);
}
}

public void click(View view) {
if (!TextUtils.isEmpty(extSdcardPath)) {
String strUri = PreferenceManager.getDefaultSharedPreferences(this).getString(PREF_DEFAULT_URI, null);
if (TextUtils.isEmpty(strUri)) {
if (Build.VERSION.SDK_INT >= 19) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, DOCUMENT_TREE_REQUEST);
}
} else {
Uri uri = Uri.parse(strUri);
DocumentFile rootDocumentFile = DocumentFile.fromTreeUri(this, uri);
createFile(rootDocumentFile);
}
}

}

private void createFile(DocumentFile documentFile) {
DocumentFile newFile = documentFile.createFile("text/plain", "M...y Novel");
OutputStream out = null;
try {
out = getContentResolver().openOutputStream(newFile.getUri());
out.write("A long time ago...".getBytes());
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}

String TAG = "Stttttttx";

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == DOCUMENT_TREE_REQUEST && resultCode == RESULT_OK) {
Uri uri = data.getData();
final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
PreferenceManager.getDefaultSharedPreferences(this).edit().putString(PREF_DEFAULT_URI, uri.toString()).commit();
DocumentFile documentFile = DocumentFile.fromTreeUri(this, uri);
for (DocumentFile file : documentFile.listFiles()) {
Log.d(TAG, "Found file " + file.getName() + " with size " + file.length());
}
createFile(documentFile);
} else {
Toast.makeText(getBaseContext(), "nonono", Toast.LENGTH_SHORT).show();
}


}


public void root(View view) {
boolean b = upgradeRootPermission(getPackageCodePath());
if (b) {
Toast.makeText(getBaseContext(), "rootle ", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getBaseContext(), "mei toor ", Toast.LENGTH_SHORT).show();
}
}

public static boolean upgradeRootPermission(String pkgCodePath) {
Process process = null;
DataOutputStream os = null;
try {
String cmd = "chmod 777 " + pkgCodePath;
process = Runtime.getRuntime().exec("su"); //切换到root帐号
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(cmd + "\n");
os.writeBytes("exit\n");
os.flush();
process.waitFor();
} catch (Exception e) {
return false;
} finally {
try {
if (os != null) {
os.close();
}
process.destroy();
} catch (Exception e) {
}
}
return true;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值