android capture 拍照 点击确定无反应

本文探讨了在具有多个SD卡的设备上使用系统相机拍照时遇到的问题,详细分析了Environment.getExternalStorageState()返回removed时的解决方案,并提供了一个工具类帮助开发者在不同设备上正确获取SD卡路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

代码:

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

}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值