Androidは携帯フォルダを読み込み指定フォルダの下に保存
12341 ワード
昨日のプロジェクトは指定したフォルダの下に画像を保存する必要があり、ファイルマネージャを使って指定したフォルダを選択する必要がありました.いくつかの問題に遭遇しました
1.携帯電話の記憶は現在、3つの部分から構成されています.基本的には、内部記憶、携帯電話内蔵外部記憶(ROM)、携帯電話SDカードです.
1)内部ストレージ:
2)携帯電話内蔵外部記憶(Rom):
3)SDカードのメモリに問題が発生しました.上の方法は見覚えがあるようですが、Sdカードを手に入れるのではないでしょうか.私も長い間困っていましたが、もちろん答えも得られませんでした.仕方がありません.次の方法で得ました.
修正:以上の方法でsdカードに掛けているかどうかを判断し、sdカードのルートディレクトリを取得すると、テスト中には正確ではない携帯電話もあります.sdカードを外に置くルートが「/storage/sdcard 1」とは限らないので、大神の方法を探して、彼のツール類とbean類を抽出します.以下のようにします.
2. Android6.0システムの携帯電話は外付けのストレージの下のファイルとフォルダを読み取れません
3.表示されるフォルダには隠しフォルダが含まれています.削除する必要があります.これは実は簡単です.隠しフォルダはすべて「.」冒頭ですので、以下の方法を使えばいいのですが、ついでにフォルダをアルファベット順に並べ替える方法もあります
最后にdemo全体を私达の资源の中に置いて、必要なのはダウンロードすることができます...
1.携帯電話の記憶は現在、3つの部分から構成されています.基本的には、内部記憶、携帯電話内蔵外部記憶(ROM)、携帯電話SDカードです.
1)内部ストレージ:
getFilesDir()
この方法で携帯電話の内部に格納できます(パッケージフォルダの下のようですが、テストしていません)2)携帯電話内蔵外部記憶(Rom):
new File(Environment.getExternalStorageDirectory().getAbsolutePath())
この方法でファイルを得ることができます3)SDカードのメモリに問題が発生しました.上の方法は見覚えがあるようですが、Sdカードを手に入れるのではないでしょうか.私も長い間困っていましたが、もちろん答えも得られませんでした.仕方がありません.次の方法で得ました.
File file = new File("/storage/sdcard1");
if (null != file.listFiles() && file.listFiles().length > 0) {
fileNameList.add(" ");
}
修正:以上の方法でsdカードに掛けているかどうかを判断し、sdカードのルートディレクトリを取得すると、テスト中には正確ではない携帯電話もあります.sdカードを外に置くルートが「/storage/sdcard 1」とは限らないので、大神の方法を探して、彼のツール類とbean類を抽出します.以下のようにします.
public class StorageUtils {
public static ArrayList getStorageData(Context pContext) {
final StorageManager storageManager = (StorageManager) pContext.getSystemService(Context.STORAGE_SERVICE);
try {
// StorageManager getVolumeList()
final Method getVolumeList = storageManager.getClass().getMethod("getVolumeList");
// StorageVolume
final Class> storageValumeClazz = Class.forName("android.os.storage.StorageVolume");
// StorageVolume
final Method getPath = storageValumeClazz.getMethod("getPath");
Method isRemovable = storageValumeClazz.getMethod("isRemovable");
Method mGetState = null;
//getState 4.4_r1 , ( 4.4_r1)
// (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/android/os/Environment.java/)
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
try {
mGetState = storageValumeClazz.getMethod("getState");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
// getVolumeList , :“ ”
final Object invokeVolumeList = getVolumeList.invoke(storageManager);
final int length = Array.getLength(invokeVolumeList);
ArrayList list = new ArrayList<>();
for (int i = 0; i < length; i++) {
final Object storageValume = Array.get(invokeVolumeList, i);// StorageVolume
final String path = (String) getPath.invoke(storageValume);
final boolean removable = (Boolean) isRemovable.invoke(storageValume);
String state;
if (mGetState != null) {
state = (String) mGetState.invoke(storageValume);
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
state = Environment.getStorageState(new File(path));
} else {
if (removable) {
state = EnvironmentCompat.getStorageState(new File(path));
} else {
// , mounted
state = Environment.MEDIA_MOUNTED;
}
}
}
long totalSize = 0;
long availaleSize = 0;
if (Environment.MEDIA_MOUNTED.equals(state)) {
totalSize = StorageUtils.getTotalSize(path);
availaleSize = StorageUtils.getAvailableSize(path);
}
StorageBean storageBean = new StorageBean();
storageBean.setAvailableSize(availaleSize);
storageBean.setTotalSize(totalSize);
storageBean.setMounted(state);
storageBean.setPath(path);
storageBean.setRemovable(removable);
list.add(storageBean);
}
return list;
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
private static long getTotalSize(String path) {
try {
final StatFs statFs = new StatFs(path);
long blockSize = 0;
long blockCountLong = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
blockSize = statFs.getBlockSizeLong();
blockCountLong = statFs.getBlockCountLong();
} else {
blockSize = statFs.getBlockSize();
blockCountLong = statFs.getBlockCount();
}
return blockSize * blockCountLong;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
private static long getAvailableSize(String path) {
try {
final StatFs statFs = new StatFs(path);
long blockSize = 0;
long availableBlocks = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
blockSize = statFs.getBlockSizeLong();
availableBlocks = statFs.getAvailableBlocksLong();
} else {
blockSize = statFs.getBlockSize();
availableBlocks = statFs.getAvailableBlocks();
}
return availableBlocks * blockSize;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
private static final long A_GB = 1073741824;
private static final long A_MB = 1048576;
private static final int A_KB = 1024;
public static String fmtSpace(long space) {
if (space <= 0) {
return "0";
}
double gbValue = (double) space / A_GB;
if (gbValue >= 1) {
return String.format("%.2fGB", gbValue);
} else {
double mbValue = (double) space / A_MB;
if (mbValue >= 1) {
return String.format("%.2fMB", mbValue);
} else {
final double kbValue = space / A_KB;
return String.format("%.2fKB", kbValue);
}
}
}
}
public class StorageBean implements Parcelable {
/**
*
*/
private String path;
/**
* mounted removed
*/
private String mounted;
/**
* , , TF ( SD )
*/
private boolean removable;
/**
*
*/
private long totalSize;
/**
*
*/
private long availableSize;
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getMounted() {
return mounted;
}
public void setMounted(String mounted) {
this.mounted = mounted;
}
public boolean getRemovable() {
return removable;
}
public void setRemovable(boolean removable) {
this.removable = removable;
}
public long getTotalSize() {
return totalSize;
}
public void setTotalSize(long totalSize) {
this.totalSize = totalSize;
}
public long getAvailableSize() {
return availableSize;
}
public void setAvailableSize(long availableSize) {
this.availableSize = availableSize;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.path);
dest.writeString(this.mounted);
dest.writeByte(removable ? (byte) 1 : (byte) 0);
dest.writeLong(this.totalSize);
dest.writeLong(this.availableSize);
}
public StorageBean() {
}
protected StorageBean(Parcel in) {
this.path = in.readString();
this.mounted = in.readString();
this.removable = in.readByte() != 0;
this.totalSize = in.readLong();
this.availableSize = in.readLong();
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
@Override
public StorageBean createFromParcel(Parcel source) {
return new StorageBean(source);
}
@Override
public StorageBean[] newArray(int size) {
return new StorageBean[size];
}
};
@Override
public String toString() {
return "StorageBean{" +
"path='" + path + '\'' +
", mounted='" + mounted + '\'' +
", removable=" + removable +
", totalSize=" + totalSize +
", availableSize=" + availableSize +
'}';
}
}
以上のツール類で大丈夫ですが、読み取ったセットの中には8つの記憶位置があることがわかりました.もちろん上位2つだけ取ればいいのです(他の鬼は何も知りません).2. Android6.0システムの携帯電話は外付けのストレージの下のファイルとフォルダを読み取れません
File[] files = file.listFiles();
このメソッドではfilesが空です.何だ?その後、権限の問題であることが判明し、機能リストファイルで権限を申請したが、6.0は危険権限を動的に二次申請するコードが必要であるため、以下のコードを加えた. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//6.0
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {//
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_READ_CONTACTS_SD);
} else {//
file = new File("/storage/sdcard1");
nextFileList(file);
}
} else {//6.0
file = new File("/storage/sdcard1");
nextFileList(file);
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {//
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//
file = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
nextFileList(file);
} else {//
}
}
break;
case MY_PERMISSIONS_REQUEST_READ_CONTACTS_SD://sd
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//
file = new File("/storage/sdcard1");
nextFileList(file);
} else {//
}
break;
}
}
もちろん、ここではユーザーが再要求処理を拒否したことについて、私たちは処理していないので、研究を続けていません.3.表示されるフォルダには隠しフォルダが含まれています.削除する必要があります.これは実は簡単です.隠しフォルダはすべて「.」冒頭ですので、以下の方法を使えばいいのですが、ついでにフォルダをアルファベット順に並べ替える方法もあります
for (int num = 0; num < files.length; num++) {
if (files[num].isDirectory()) {
String name = files[num].getName();
if (!name.startsWith(".")) {//
fileNameList.add(name);
}
}
}
Collections.sort(fileNameList, Collator.getInstance(Locale.ENGLISH));//
最后にdemo全体を私达の资源の中に置いて、必要なのはダウンロードすることができます...