web-dev-qa-db-ja.com

SDカードID番号の読み方は?

シリアル番号やその他の情報を含むSDカードCIDレジスタをプログラムで読み取るにはどうすればよいですか? Android Java、またはネイティブコードを介してそれを行うことはできますか?

よろしくお願いします、エリック

17
Eric Hamilton

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();
}
13

携帯電話を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

7
delcypher

私はこれを作った...それは私のために働いた...それがあなたを明確にすることを望んでいる!

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;
    }
5
Aditya Nikhade

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で動作させることができる場合があります。

5
Paul Gregoire

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へのソフトリンク(システムによって自動的に確立されます)です。

4
Samuel Tardieu

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

4
southerton

私が知っている、そして必要な一般的な解決策のためにこれを行うことができる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カードコントローラードライバーにマップします。

3
BMB

にとって 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/

2
yurenchen

私もこの機能を探していましたが、自家製のソリューションを得ることができませんでした。 SIDリーダーを作る会社を見つけました。 nexcopy.comにアクセスして、SDまたはmicroSDデュプリケーターのセクションを確認してください。一度に最大20枚のカードを読み取ることができます。

2
Jesus

比較的古いPalm OSおよびWindows Mobile OSデバイスはSDカードIDを読み取ることができますが、AFAIK Androidデバイスはまだそれを行うことができません。これは特に、議論されたSettings.Secure.Android_ID here

1
gregS

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でした。

0
LarsH