Android本地相册图片URI转换绝对路径

最近做毕设的时候遇到了这个问题,一直给我报错java.io.notFound啥的啥的,不管怎么修改路径都是报这个错误,今天终于解决了,记录一下解决过程。

首先我们调用系统相册。

 Intent intent = new Intent(Intent.ACTION_PICK, null);
                intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                startActivityForResult(intent, 2);
protected void onActivityResult(int requestCode, int resultCode, Intent data){
   


        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 2) {
   
            // 从相册返回的数据
            if (data != null) {
   
                // 得到图片的全路径
                Uri uri = data.getData();
                imageView.setImageURI(uri);
                ocrtest.ocrtest(uri);
            }
        }

如上即可调用相册模块进行选择本机图片,但是这样选出来的路径是URI,也就是资源统一标识符,并不是图片的绝对路径,我们需要做修改,这里把我的FileUtil类上传,直接使用即可FileUtil类下载

在FileUtil类中,getFileAbsolutePath函数是根据URI获取绝对路径,包含两个参数context,uri。
第一个是上下文,第二个就是文件的uri。函数返回值时String类型的绝对路径RealPath。

在新建类ORCtest中调用如下
其中mContext如下

Context mContext;

    public OcrTest(Context context){
   
        mContext = context;
    }

此后就可以转换为绝对路径,之后在调用百度AI的官方文档中的代码即可。

String realpath = FileUtil.getFileAbsolutePath(mContext, uri);
            Log.i("realpath",  realpath);
            byte[] imgData = FileUtil.readFileByBytes(realpath);
            String imgStr = Base64Util.encode(imgData);
            String imgParam = URLEncoder.encode(imgStr, "UTF-8");
            String param = "image=" + imgParam;
            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String result = HttpUtil.post(url, accesstoken, param);
            System.out.println(result);
            return result;

返回结果
需要注意的是,在Android6.0之后,则需要加入动态权限获取,否则会报Permission denied错误。
权限获取代码如下

在AndroidManifest.xml文件中加入

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
    <uses-permission android:name="android.permission.INTERNET" />

在java代码中加入此函数

 private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
   
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE };

    /** * Checks if the app has permission to write to device storage * * If the app does not has permission then the user will be prompted to * grant permissions * * @param activity */
    public static void verifyStoragePermissions(Activity activity) {
   
        // Check if we have write permission
        int permission = ActivityCompat.checkSelfPermission(activity,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if (permission != PackageManager.PERMISSION_GRANTED) {
   
            // We don't have permission so prompt the user
            ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE);
        }
    }
全部评论
积累到素材啦
点赞
送花
回复
分享
发布于 2022-10-24 18:03 陕西

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务