Android 各版本 SD卡檔案讀寫變化及其音樂播放

farsun發表於2021-09-09

1.Android6.0 平臺應用獲取外接sd卡路徑 

Android6.0 上會根據卡的種類和卡的掛載狀態來動態生成掛載路徑,因此不建議大家在按照以前的方法獲取外接SD卡或者usbotg的路徑,建議按照以下方法來獲取:

[程式碼]xml程式碼:

StorageManager   mStorageManager = StorageManager.from(context);

finalList vols = mStorageManager.getVolumes();

VolumeInfo   sdcardVolume = null ;

for(VolumeInfo   vol : vols){

  if(vol.getDisk() != null && vol.getDisk().isSd())sdcardVolume = vol;

 

//如果需要獲取usbotg的路徑,則改為

   // if(vol.getDisk() != null &&vol.getDisk().isUsb()) usbotgVolume = vol;

}

 

if(sdcardVolume!= null) {

   String sdcardPath = sdcardVolume.getPath()==null ? null :sdcardVolume.getPath().toString();

   String sdcardState = sdcardVolume.getEnvironmentForState(sdcardVolume.getState());

   if(sdcardState.equals(Environment.MEDIA_MOUNTED) && sdcardPath != null){

        //外接SD卡已掛載,且路徑有效

        // sdcardPath 外接SD卡的路徑

   }      

}

 

2.Android6.0 storage目錄sd卡儲存的路徑建立

之前一直很疑惑,android6.0上sd卡掛載storage下的sd卡路徑是什麼時候建立的。

因為掛載sd卡的PublicVolume,負責建立mount路徑,然後掛載。

接著會建立幾個fuse路徑,如下:

1./mnt/runtime/default/

2./mnt/runtime/read/

3./mnt/runtime/write/

然後會把這個mount的路徑fuse到上面這幾個路徑。

但是一直沒有storage/下sd卡路徑的建立,而在PublicVolume下doMount函式也只有設定mPath為storage/....確沒有建立這個路徑。

後來終於在init.rc中發現下面這句

[程式碼]xml程式碼:

on post-fs

    start logd

 

    #add for amt

    chmod 0755 /amt

    # once everything is setup, no need to modify /

    mount rootfs rootfs / ro remount

    # Mount shared so changes propagate into child namespaces

    mount rootfs rootfs / shared rec

    # Mount default storage into root namespace

    mount none /mnt/runtime/default /storage slave bind rec

3.Android 4.4 SD卡檔案讀寫變化:

Context.getExternalFilesDirs(), 返回多個sd卡的該應用私有資料區的files目錄 

[程式碼]xml程式碼:

/storage/sdcard0/Android/data/<包名>/files

/storage/sdcard1/Android/data/<包名>/files

Context.getExternalCacheDirs(), 返回多個sd卡下該應用私有資料庫的快取目錄

[程式碼]xml程式碼:

/storage/sdcard0/Android/data/<包名>/caches

/storage/sdcard1/Android/data/<包名>/caches

Context.getObbDirs(), 返回多個sd卡下obb目錄下的私有資料

[程式碼]xml程式碼:

/storage/sdcard0/Android/obb/<包名>

/storage/sdcard1/Android/obb/<包名>

目前這些api均為hide,需透過反射呼叫

對讀寫許可權的修改

    如果應該僅需讀取sd卡下該應用私有資料的資料,則不需要申請讀寫許可權(WRITE_EXTERNAL_STORAGE 、READ_EXTERNAL_STORAGE )

如果需要讀取sd卡其他目錄,則需宣告讀sd卡許可權

如果需要寫入sd卡其他目錄,則需宣告寫sd卡許可權

對於存在多個sd卡的情況,僅對主卡、及每張卡的私有資料區下的檔案有讀寫許可權,對其他卡沒有寫許可權(之前廠商實現中,對每張sd卡均有讀寫許可權)

  1.在內建卡進行寫操作【android.permission.WRITE_EXTERNAL_STORAGE 的許可權用來設定了內建sd卡的寫許可權,如果在manifest中只是配置了這個許可權,那個應用只能在內建sd卡中進行寫操作】

或在內建卡進行讀操作【<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>該程式可以讀取裝置外部儲存空間(內建SDcard和外接SDCard)的檔案,如果您的App已經新增了“WRITE_EXTERNAL_STORAGE ”許可權 ,則就沒必要新增讀的許可權了,寫許可權已經包含了讀許可權了。】

2.然後再手機記憶體卡中:Android-->data中設定一個資料夾,然後再資料夾中放置要儲存的音樂檔案;

3.Android工程裡,設定路徑是: "/storage/sdcard0/Android/data/HandlerActivity/goldfallen.mp3";



4.在工程裡播放音樂:

[程式碼]xml程式碼:

//例項化MediaPlayer

MediaPlayer player = MediaPlayer.create(this,R.raw.test);

//開始播放

player.start();

5.在資料夾中設定播放音樂

1)例項化一個MediaPlayer

2)呼叫setDataSource()方法設定播放檔案路徑

3)先呼叫prepare(),然後呼叫start()方法播放

[程式碼]xml程式碼:

//例項化MediaPlayer

MediaPlayer mp = new MediaPlayer();

//播放路徑

String path = “/sdcard/test.mp3”;

//為MediaPlayer設定資料來源

mp.setDataSource(path);

//準備

mp.prepare();

//播放

mp.start();

6.從網路中播放

方法一

1)建立URI例項

2)根據一個MediaPlayer例項,使用MediaPlayer的靜態方法create(),透過傳遞URI引數完成

3)呼叫start()方法開始播放

[程式碼]xml程式碼:

//播放路徑

String path = “”;

//將字串URI解析為URI例項

Uri uri = Uri.parse(path);

//例項化MediaPlayer

MediaPlayer player = MediaPlayer.create(this,uri);

//播放

player.start();

 

原文連結:http://www.apkbus.com/blog-792467-60514.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4289/viewspace-2816071/,如需轉載,請註明出處,否則將追究法律責任。

相關文章