调用系统相机进行拍照,照片保存到指定目录。
代码:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File( path );
Uri uri = Uri.fromFile(file);
camera_path = uri.toString();
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
网上代码很多,copy可以使用,但是换个手机之后就有问题出现了。
拍照以后按确定不返回 onActivityResult。 也不出现异常提醒
调试发现 Environment.getExternalStorageState() 为 "removed"
Environment.getExternalStorageDirectory() 返回的目录是 "/storage/sdcrad0"
不采用调用的方式直接拍照,图片存储的地址为 "/storage/sdcrad1/DCIM/Camera/XX.jpg"
问题的原因找到了,某些手机上是有2张sdcard
而"storage/sdcrad0"不能创建文件,Environment.getExternalStorageDirectory()返回的又是"sdcrad0"
问题既然原因既然找到了,就来解决它。
我的解决思路是这样的:列出手机上所有的sdcrad,逐个检测能用的
代码改为:获得能使用的顶级sdcard目录
File file = new File( SdCardHelper.getMountedStorageDirectory() + path );
结合网上的代码写了一个工具类:
public class SdCardHelper {
public static String[] getSdcardPaths()
{
String paths[] = null;
StorageManager sm = (StorageManager) ContextHelper.getContext().getSystemService(Context.STORAGE_SERVICE);
try {
paths = (String[]) sm.getClass().getMethod("getVolumePaths", null).invoke(sm, null);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return paths;
}
public static String getMountedStorageDirectory()
{
String paths[] = getSdcardPaths();
for( int i=0;i<paths.length;i++ )
{
String p = paths[i] + "/_file111111111111111";
try
{
File f = new File( p );
if( !f.exists() )
{
if( f.mkdirs() )
{
f.delete();
return paths[i];
}
}
}catch (Exception e)
{
e.printStackTrace();
}
}
return null;
}
public static String getStorageDirectory()
{
if( Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) )
{
return Environment.getExternalStorageDirectory().toString();
}
else
{
return getMountedStorageDirectory();
}
}
}