继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Android 各版本 SD卡文件读写变化及其音乐播放

白衣染霜花
关注TA
已关注
手记 126
粉丝 17
获赞 57

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 = “http://ms1.m.mop.com/22/111.mp3”;

//将字符串URI解析为URI实例

Uri uri = Uri.parse(path);

//实例化MediaPlayer

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

//播放

player.start();

 

原文链接:http://www.apkbus.com/blog-792467-60514.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP