シリアル番号やその他の情報を含むSDカードCIDレジスタをプログラムで読み取るにはどうすればよいですか? Android Java、またはネイティブコードを介してそれを行うことはできますか?
よろしくお願いします、エリック
SIDとCIDを取得するためのサンプルコードは次のとおりです
if (isExteranlStorageAvailable()) {
try {
File input = new File("/sys/class/mmc_Host/mmc1");
String cid_directory = null;
int i = 0;
File[] sid = input.listFiles();
for (i = 0; i < sid.length; i++) {
if (sid[i].toString().contains("mmc1:")) {
cid_directory = sid[i].toString();
String SID = (String) sid[i].toString().subSequence(
cid_directory.length() - 4,
cid_directory.length());
Log.d(TAG, " SID of MMC = " + SID);
break;
}
}
BufferedReader CID = new BufferedReader(new FileReader(
cid_directory + "/cid"));
String sd_cid = CID.readLine();
Log.d(TAG, "CID of the MMC = " + sd_cid);
} catch (Exception e) {
Log.e("CID_APP", "Can not read SD-card cid");
}
} else {
Toast.makeText(this, "External Storage Not available!!",
Toast.LENGTH_SHORT).show();
}
携帯電話をUSB経由でコンピューターに接続し、adbツール(Android SDK)を使用してSDカードのCIDを見つけることができました
$ adb Shell
# cat /sys/block/mmcblk0/../../cid
私の電話はルート化されているので、ルート化されていない電話でこれにアクセスできるかどうかはわかりません。
また、試してみてください
$ adb Shell
# cd /sys/block/mmcblk0/../../
# ls
block fwrev preferred_erase_size
cid hwrev scr
csd manfid serial
date name subsystem
driver oemid type
erase_size power uevent
これらはカーネルのドキュメントで説明されています http://www.mjmwired.net/kernel/Documentation/mmc/mmc-dev-attrs.txt
私はこれを作った...それは私のために働いた...それがあなたを明確にすることを望んでいる!
String getSDCARDiD()
{
try {
File file = new File("/sys/block/mmcblk1");
if (file.exists() && file.isDirectory()) {
memBlk = "mmcblk1";
} else {
//System.out.println("not a directory");
memBlk = "mmcblk0";
}
Process cmd = Runtime.getRuntime().exec("cat /sys/block/"+memBlk+"/device/cid");
BufferedReader br = new BufferedReader(new InputStreamReader(cmd.getInputStream()));
sd_cid = br.readLine();
//System.out.println(sd_cid);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sd_cid;
}
IDを提供するためにこれまでに見つけた唯一のコードはC++またはC#です http://jo0ls-dotnet-stuff.blogspot.com/2008/12/read-secure-digital-sd-card-serial .html
http://jo0ls-dotnet-stuff.blogspot.com/2008/12/read-cid-and-csd-c-implementation.html
C++開発者の場合は、これを使用してAndroidで動作させることができる場合があります。
BMBが書いたように、/ sysファイルシステム内のSDカードの実際のパスを知ることはできません。ただし、/ sysはエイリアスも実装しているため、/ sys/block/mmcblk0/device/cidを介してCIDを取得できる場合があります。
たとえば、2.2を実行しているタトゥーでは、/ sys/block/mmcblk0は/sys/devices/platform/msm_sdcc.2/mmc_Host/mmc1/mmc1:aaaa/block/mmcblk0へのソフトリンク(システムによって自動的に確立されます)です。
AndroidにsdカードのシリアルIDを取得するためのAPIがあります。メソッドはgetFatVolumeId(String mountPoint)と呼ばれ、「mountPoint」はsdカード名です(この名前はEnvironment.getExternalStorageDirectoryを呼び出すことで取得できます) ())。しかし、getFatVolumeIdは一種の隠し関数(または忘れられている)であるため、Android.osという名前のプロジェクトにパッケージを作成し、そのクラスをネイティブメソッドを参照して、呼び出すことができるようにします。
package Android.os;
public class FileUtils {
public static native int getFatVolumeId(String mountPoint);
}
そしてコードは:
File SdCard = Environment.getExternalStorageDirectory();
int Serial = FileUtils.getFatVolumeId(SdCard.getName());
リンクもご覧ください
http://groups.google.com/group/Android-framework/browse_thread/thread/1abd18435ba20a67?pli=1 http://markmail.org/message/rdl4bhwywywhhiau#query:+page:1 + mid:rdl4bhwywywhhiau + state:results
私が知っている、そして必要な一般的な解決策のためにこれを行うことができるAndroid APIはありません。いくつかの背景を提供するために、SDカードはに固有のハードウェアコントローラーに接続されますデバイスプラットフォーム。プラットフォームがわかっている場合は、linux/sysファイルシステムからcid値を読み取ることができます。次のスニペットは私のdroid(TI omapベースのプラットフォーム)では機能しますが、QualcommMSMベースのプラットフォームでは機能しません。
try {
BufferedReader input = new BufferedReader(new FileReader("/sys/devices/platform/mmci-omap-hs.0/mmc_Host/mmc0/mmc0:aaaa/cid"));
String sd_cid = input.readLine();
Log.i("CID_APP", sd_cid);
} catch (Exception e) {
Log.e("CID_APP","Can not read SD-card cid");
}
別のプラットフォームでは、探しているsysファイルが異なります。テストできなかったため、同じプラットフォームの異なるカード間でも異なる場合があります。 MSMベースのデバイスでは、パスは/sys/devices/platform/msm_sdcc.1/mmc_Host/...のようになります。
このハードウェアはSDカードのCIDの読み取りに依存しているため、Android API:sに一般的なアクセスを提供するAPIを更新する必要があります。このAPIは、各デバイスメーカーは、正しいSDカードコントローラードライバーにマップします。
にとって mmcblk0
、シェルに次のように記述します。
cat /sys/block/mmcblk0/device/cid
2750485344303847307cf6851900b99b
cat /sys/block/mmcblk0/device/serial
0x7cf68519
Javaで簡単に実装できます。
ref:
https://www.kernel.org/doc/Documentation/mmc/mmc-dev-attrs.txt
https://www.kernel.org/doc/Documentation/sysfs-rules.txt
http://www.cameramemoryspeed.com/sd-memory-card-faq/reading-sd-card-cid-serial-psn-internal-numbers/
私もこの機能を探していましたが、自家製のソリューションを得ることができませんでした。 SIDリーダーを作る会社を見つけました。 nexcopy.comにアクセスして、SDまたはmicroSDデュプリケーターのセクションを確認してください。一度に最大20枚のカードを読み取ることができます。
比較的古いPalm OSおよびWindows Mobile OSデバイスはSDカードIDを読み取ることができますが、AFAIK Androidデバイスはまだそれを行うことができません。これは特に、議論されたSettings.Secure.Android_ID here 。
Dineshの答えに基づいて...
Dineshは、_cid
という名前のファイルをディレクトリ/sys/class/mmc_Host/mmc1/mmc1:*/
(*は数字)で探すことを提案しました。これにより、カードのCIDレジスターの内容がわかります。これは多くの場合に機能し、非常に役立つスタートです。
ただし、mmc1
は必ずしもリムーバブルSDカードであるとは限りません。時々、例えばMotorola DroidProでAndroid APIレベル10、mmc0
はリムーバブルSDカード、mmc1
は別のものです。mmc1
が存在する場合、それはある種の内部ストレージを指していると思います(おそらく取り外し不可能なmicroSDカード)。安価なAndroidテストしたタブレットでは、mmc0
はSDカードであり、mmc1
はありません。
したがって、mmc1
がSDカードであると仮定することはできません。
希望のかすかな光:(これまでのところ)type
ファイルと同じディレクトリにあるcid
ファイル(たとえば、/sys/class/mmc_Host/mmc1/mmc1:0007/type
)を見ると、どちらがタイプか判別できます: SD
の値はリムーバブルSDカードを示しますが、MMC
はそうではありません。
ただし、これはいくつかのAndroidデバイスでテストしただけです。type
ファイルの内容に関する仕様が見つからないため、他の誰かが関連ドキュメントを知っている場合は、私にお知らせください。
もちろん、MMCとSDは2つの異なるストレージ技術標準であり、SDはMMCと下位互換性があります。したがって、そうではありません必然的にタイプSDが常に対応する場合外付けのmicroSDカードに接続します。MMC
がmicroSDカードを示す可能性は低いようです(typeフィールドが正確に入力されている場合)。一方、リムーバブルでないSDは、カードのタイプはSD
です。
さらなる研究のために:このアプローチは、microSDカードがUSBアダプターを介して接続されている場合に機能しますか?タブレットを使用したこれに関する私の1つのテストでは、USB接続のmicroSDカードがmmc1
として表示され、タイプはSD
でした。