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