Androidプログラミングは携帯電話の内部記憶経路の取得方法を実現します。

3857 ワード

この例は、Androidプログラミングによる携帯電話の内部記憶経路の取得方法を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
私は中興のAndroid携帯電話を持っています。機種はZTE U 930 HDです。携帯は外付けSDカードを挿入していません。(つまりMicro SDカードです。元の名前はTrans-flashカードです。TFカード)。2004年に正式にMicroSDカードと改名しましたが、本体には内蔵メモリカードがあります。
この携帯電話をデータ線でパソコンに挿しても、ディスクが見られます。「R.Eマネージャ」などのファイル管理アプリケーションをインストールすることによって、ファイルを管理することもできます。また、この保存されているマウントディレクトリを見ることができます。
しかし、私はEvironment.getExternal StrageStateを印刷しましたが、「removed」に戻りました。
これはどういうことですか?携帯はSDカードを内蔵していますが、なぜこのような情報を提示しますか?
またEvironment.get External StrageDirectoryを印刷してみました。
説明できそうです。私の携帯電話でEvironment.getExternal StrageDirectory()を呼び出して、戻ってきたメモリーディレクトリはシステム内蔵のSDカードディレクトリではありません。
またソニーL 39 uを変えました。MOTO Gを呼び出して、Evironment.get External StrageDirectoryを呼び出します。帰ってきたディレクトリはシステム内蔵のSDカードのディレクトリです。
異なるデバイスでは、getExternal StrageDirectoryを呼び出しますが、戻り値は異なります。Androidの文書を調べてみたところ、この方法は現在の機器メーカーが考えている「外部メモリ」に戻り、外付けのSDカードディレクトリ(MicroSDカード)に戻る可能性があり、内蔵の記憶先(eMMC)に戻る可能性があるということです。
まとめてみます
一部の携帯電話はeMMCを/mnt/externalに保存します。sd、/mnt/sdcard 2などのノードは、外付けのSDカードをEvironment.get External StrageDirectory()という結点にマウントする。
このとき、Evironment.getExternal StrageDirectory()を呼び出すと、外付けのSDの経路に戻ります。
もう一部の携帯電話は、Evironment.getExternal StrageDirectory()というノードに直接eMMCを格納し、本物の外付けSDカードを/mnt/external_にマウントする。sd、/mnt/sdcard 2などのノード。
このとき、Evironment.getExternal StrageDirectory()を呼び出すと、内蔵のSDの経路に戻ります。
これですべてのSDカードがないと解釈できます。中興の携帯で呼び出します。
Environment.get External StrageStateを印刷して、“removed”に帰って、ソニー、MOTO Gの上で帰ります:“mounted”
理由はすでに分かりましたが、どうやって外付けSDカードがない時に、この内蔵のeMMCに格納されている具体的な経路を取得しますか?
例えば、私の中興携帯はEvironment.get External StrageDirectory()を使って外付けのSDカードの経路を取得しましたが、SDカードを挿入していません。この時は内蔵のeMMCを使ってプログラムに使うデータを記憶したいですが、このeMMCメモリの経路をどうやって取得しますか?
システムファイル「system/etc/vold.fstab」をスキャンして実現します。
「system/etc/vold.fstab」は、Androidのマウントポイント情報を記述する簡単なプロファイルです。
このファイルを巡回してすべてのマウントポイントを取得できます。

/**
*    "system/etc/vold.fstab"   ,     Android      
* 
* @return
*/
private static ArrayList<String> getDevMountList() {
  String[] toSearch = FileUtils.readFile("/etc/vold.fstab").split(" ");
  ArrayList<String> out = new ArrayList<String>();
  for (int i = 0; i < toSearch.length; i++) {
   if (toSearch[i].contains("dev_mount")) {
    if (new File(toSearch[i + 2]).exists()) {
     out.add(toSearch[i + 2]);
    }
   }
  }
  return out;
}

その後、Evironment.get External StrageState()が「removed」に戻ったとき(つまり、外付けSDカードをマウントしていないとき)、get DevMount List()方法でlistを取得し、このリストで書き込みができるのは、システムが持参したeMMCメモリディレクトリです。
判定ロジック:

/**
*     SD     
* 
*       SD ,     ,       SD   
*   :    SD   
* 
* @return
*/
public static String getExternalSdCardPath() {
  if (SDCardUtils.isMounted()) {
   File sdCardFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
   return sdCardFile.getAbsolutePath();
  }
  String path = null;
  File sdCardFile = null;
  ArrayList<String> devMountList = getDevMountList();
  for (String devMount : devMountList) {
   File file = new File(devMount);
   if (file.isDirectory() && file.canWrite()) {
    path = file.getAbsolutePath();
    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmmss").format(new Date());
    File testWritable = new File(path, "test_" + timeStamp);
    if (testWritable.mkdirs()) {
     testWritable.delete();
    } else {
     path = null;
    }
   }
  }
  if (path != null) {
   sdCardFile = new File(path);
   return sdCardFile.getAbsolutePath();
  }
  return null;
}

ここで述べたように、皆さんのAndroidプログラムの設計に役に立ちます。