注:この質問は、マウントされたボリュームのUUIDではなく、物理SDカードのシリアル番号に関するものです。これらは2つの独立したデータです。
Androidの一部のバージョン、およびLinuxの他のバリアントでは、マウントされたSDカードのシリアル番号を取得することが可能です。 /sys/class/mmc_Host/mmc0/mmc0:0001/serial
または/sys/block/mmcblk0/device/serial
の内容を読み取る(特定の数値は異なる場合があります)。私のテストでは、SDカードが組み込みのSDカードスロットに挿入されている限り(USBアダプター経由でマウントされていない限り)、これはかなり確実に機能しました。
しかし、Android 7.0 Nougat、 OSがアクセスをブロックしていると言われています の時点で、少なくとも一部のデバイスではこの情報にアクセスできます。テストアプリを新しいアルカテルA30 GSM(Android 7.0)、そして実際には上記のアプローチは許可エラーで失敗します:
Java.io.FileNotFoundException: /sys/block/mmcblk0/device/serial (Permission denied)
at Java.io.FileInputStream.open(Native Method)
今後の参考のために、私たち(adb Shellからテスト)には、次のls -ld
へのアクセス許可があります。
/sys/class/mmc_Host
ではなく/sys/class/mmc_Host/mmc0
/sys/block
ではなく/sys/block/mmcblk0
上記のアプローチが機能しないため、
Android 7.0以降で)マウントされたSDカードのシリアル番号を取得する別の方法はありますか?
それが失敗した場合、この機能を提供するか提供しない計画について、Googleからの文書やその他の声明はありますか? Android issue tracker で何も見つかりませんでしたが、正しく検索していない可能性があります。
質問を明確にするために、私は、ルート化されていないデバイス上で実行されている通常の(システムではない)アプリが、アプリが通常要求および受信できるすべての権限で何ができるかについて話しています。
参考までに、/sbin
ディレクトリは読み取り可能ではないため、/sbin/udevadm
のようなコマンドはオプションではありません。
Androidで、/ sys nad/procへのNアクセスが大幅に制限されました。これは、アプリケーションが実行されるサンドボックスをより厳密にするために行われました。これは https://issuetracker.google。 com/issues/37091475 意図的。実際には/ sys内のすべてのデータにアクセスできないとは言われておらず、Googleはこの場所から他のファイルへのアクセスを許可するために開いています:
/ sysに特定のファイルがあり、アプリケーションで使用できるはずであるが使用できないと思われる場合は、リクエストを評価できる新しいバグを報告してください。たとえば、/ sys/devices/system/cpuはすべてのプロセスで使用できるため、すべての/ sysが制限されていると言うのは不正確です。
GoogleがAppleではハードウェアIDを取得することが許可されていない場合)と同様の変更を行っているという悪い考えがあります。それが解決しない場合の解決策は、代わりにGoogleアカウントIDを使用することです。ただし、常に可能であるとは限らず、ビジネスロジック(ライセンスなど)に大きな変更が必要になることは承知しています。
うまくいけば、あなたの バグレポート は積極的に検討されます。
別の関連SO見つかりました: Android Nougat)のファイルシステムの変更
StorageManagerから取得したStorageVolumeで StorageVolume.getUuid() を使用します。
値はカードのフォーマット中に割り当てられたボリュームIDであり、その長さ/フォーマットはファイルシステムのタイプによって異なります。 FAT32の場合はXXXX-XXXX、NTFSの場合は長い16進文字列、内部大容量ストレージの場合はnullを返します。
AndroidでFATタイプのボリュームのUUIDまたはボリュームシリアル番号を調べる人への参考情報:X-T30(ファームウェア1.10)を含む一部のFujifilmカメラは、フォーマット時にボリュームシリアル番号をFATボリュームに書き込みません。
Windowsでは、CHKDSKはボリュームシリアル番号をまったく表示しません。 Androidでは、StorageVolume.getUuid()を呼び出すと「0000-0000」が返されます。
Androidハブを介して2つの富士フイルム形式のカードをマウントするまで、これはすべてうまくいきます。それから、Android OSは、ユーザーにいずれかのカードをフォーマットするように要求します。
ここに2つの複合問題があると思います:1)フォーマット時に富士フイルムがボリュームシリアル番号を書き込んでいない、2)Androidがボリュームシリアル番号をマウントポイントパスの一部として使用している、衝突につながります。
富士フイルムとグーグルはどちらもこの問題に注意を払いたいと思うかもしれません。
編集:Nikon D810でフォーマットされたカードにも同じ問題があり、ボリュームシリアル番号がありません。
public String getSDCARDiD()
{
String sd_cid = null;
try {
File file = new File("/sys/block/mmcblk1");
String memBlk;
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;
}
これを試してください:元のリンクを参照してください: AndroidはプログラムでSDカードのIDを取得します
adb Shell cat /sys/class/mmc_Host/mmc1/mmc1:*/cid
あなたも試すことができます
Sudo hwinfo --disk
sDカードを含むディスクの情報を取得します。
またお試しください
Sudo hdparm -I /dev/sdb | more