android capture 拍照 点击确定无反应

调用系统相机进行拍照,照片保存到指定目录。

代码:

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

}


 

发布了24 篇原创文章 · 获赞 0 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览