首页 > 其他分享 >对于相机调用和相册调用的优化以及定位地址进行识别优化

对于相机调用和相册调用的优化以及定位地址进行识别优化

时间:2023-09-09 12:01:57浏览次数:39  
标签:调用 String 相册 data uri new null 优化 out

第一阶段已经实现了,但是由于过于匆忙,导致实现bug过多,如识别优化利用外部类进行实现,内部也进行实现,相机功能与手机不匹配,每一次运行需打开储存权限,今天进行了优化,将代码简化,同时套用《第一行代码》的相机调用与相册调用的,进行修改。

实验阶段:将代码在新一个activity内进行书写,最后在进行移植,移植过程旭需注意manifist,包名等的条件。

以下为代码以及结果:

一:我的接口类:主要处理文字提取

public class Main {
   String information = "";
    public String qiuqiu(String address)
    {
        // 通用文字识别
        String url = "https://api.textin.com/ai/service/v2/recognize";
        // 请登录后前往 “工作台-账号设置-开发者信息” 查看 x-ti-app-id
        // 示例代码中 x-ti-app-id 非真实数据
        String appId = "d368dac2ac82d494a983b1baeafab48e";
        // 请登录后前往 “工作台-账号设置-开发者信息” 查看 x-ti-secret-code
        // 示例代码中 x-ti-secret-code 非真实数据
        String secretCode = "84926c65950082820bf0385a1deab535";
        BufferedReader in = null;
        DataOutputStream out = null;
        String result ="";
       // System.out.println(1);
        try {

            byte[] imgData = readfile(address); // image
            URL realUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type", "application/octet-stream");
            conn.setRequestProperty("x-tixxxxxxxx-id", appId);//进行加密处理,可自己免费申请
            conn.setRequestProperty("x-ti-xxxxxxxx", secretCode);
conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setRequestMethod("POST"); // 设置请求方式
            out = new DataOutputStream(conn.getOutputStream());
            out.write(imgData);
            out.flush();
            out.close();
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line;
          //  System.out.println(3);
            while ((line = in.readLine()) != null) {
                result += line;
            }
         //   System.out.println(4);
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!" + e);
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
       // System.out.println(5);
        String str = result;
        String startStr = "text\":\"";
        String endStr = "\"}";
       // System.out.println("识别结束");
        printSubstringsBetween(str, startStr, endStr);
        //System.out.println("识别结束");
      //  System.out.println(6);
        return information;
    }


    public static byte[] readfile(String path) {
        String imgFile = path;
        InputStream in = null;
        byte[] data = null;
        try {
            in = new FileInputStream(imgFile);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }


    public  void printSubstringsBetween(String str, String startStr, String endStr) {
        int startIndex = 0;
        while (startIndex != -1) { // 循环直到找到所有符合条件的子字符串
            startIndex = str.indexOf(startStr, startIndex); // 找到起始字符串的索引位置
            if (startIndex != -1) {
                int endIndex = str.indexOf(endStr, startIndex + startStr.length()); // 找到结束字符串的索引位置
                if (endIndex != -1) {

                    String substring = str.substring(startIndex + startStr.length(), endIndex); // 获取符合条件的子字符串
                    System.out.println(substring); // 换行输出子字符串
                    information = information + substring + '\n';
                    startIndex = endIndex + endStr.length(); // 更新起始位置
                } else {
                    break; // 如果没有找到结束字符串,则结束循环
                }
            } else {
                break; // 如果没有找到起始字符串,则结束循环
            }
        }
    }
二:MainActivity
public class MainActivity extends AppCompatActivity {

    public static final int TAKE_PHOTO = 1;

    public static final int CHOOSE_PHOTO = 2;

    private ImageView picture;

    private Uri imageUri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button takePhoto = (Button) findViewById(R.id.take_photo);
        Button chooseFromAlbum = (Button) findViewById(R.id.choose_from_album);
        picture = (ImageView) findViewById(R.id.picture);
        takePhoto.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                //用于存放拍下的照片
                File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
                try {
                    if(outputImage.exists()){
                        outputImage.delete();
                    }
                    outputImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if(Build.VERSION.SDK_INT >= 24){
//File对象转换为Uri标识对象
                    System.out.println("outputImage = " + outputImage);
                    imageUri = FileProvider.getUriForFile(MainActivity.this, "com.launcher.photoshop.fileprovider", outputImage);
                    System.out.println("imageUri = " + imageUri);
                }else{
//指定图片的输出地址
                    imageUri = Uri.fromFile(outputImage);
                }
//隐式Intent,启动相机程序
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, TAKE_PHOTO);
            }
        });
        chooseFromAlbum.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                if(ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, new
                            String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                } else {
                    openAlbum();
                }
            }
        });
    }
    private void openAlbum() {
        Intent intent = new Intent("android.intent.action.GET_CONTENT");
        intent.setType("image/*");
        startActivityForResult(intent, CHOOSE_PHOTO);
    }
    @SuppressLint("MissingSuperCall")
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case TAKE_PHOTO:
                if( resultCode == RESULT_OK ){
                    try{
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                        picture.setImageBitmap(bitmap);
                        // Android 4.0 之后不能在主线程中请求HTTP请求
                        new Thread(new Runnable(){
                            @Override
                            public void run() {
                                Main main = new Main();
                                main.qiuqiu(String.valueOf("/storage/emulated/0/Android/data/com.example.photoshop/cache/output_image.jpg"));
                            }
                        }).start();
                    } catch (FileNotFoundException e){
                        e.printStackTrace();
                    }
                }
                break;
            case CHOOSE_PHOTO:
                if(resultCode == RESULT_OK){
                    //判断版本型号
                    if(Build.VERSION.SDK_INT >= 19) {
                        //4.4以上版本
                        handleImageOnKitKat(data);
                        new Thread(new Runnable(){
                            @Override
                            public void run() {
                                Main main = new Main();
                                main.qiuqiu(String.valueOf("/storage/emulated/0/Android/data/com.example.photoshop/cache/output_image.jpg"));
                            }
                        }).start();
                    } else {
                        handleImageBeforeKitKat(data);
                    }
                }
                break;
            default:
                break;
        }
    }

    @SuppressLint("MissingSuperCall")
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    openAlbum();
                } else {
                    Toast.makeText(this, "You denide the permission", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }
    }
    @TargetApi(19)
    private void handleImageOnKitKat(Intent data) {
        String imagePath = null;
        Uri uri = data.getData();
        if(DocumentsContract.isDocumentUri(this, uri)) {
            //如果是document类型的uri,则通过document id处理
            String docId = DocumentsContract.getDocumentId(uri);
            if("com.android.providers.media.documents".equals(uri.getAuthority())) {
                Toast.makeText(this, "success01", Toast.LENGTH_SHORT).show();
                String id = docId.split(":")[1];
                String secletion = MediaStore.Images.Media._ID + "=" + id;
                imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, secletion);
            } else if("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
                Toast.makeText(this, "success02", Toast.LENGTH_SHORT).show();
                Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
                imagePath = getImagePath(contentUri, null);
            }
        } else if("content".equalsIgnoreCase(uri.getScheme())) {
            Toast.makeText(this, "success03", Toast.LENGTH_SHORT).show();
            //如果是content类型的Uri,则使用普通方式处理
            imagePath = getImagePath(uri, null);
        } else if("file".equalsIgnoreCase(uri.getScheme())) {
            //如果是file类型的uri,则直接获取文件路径
            Toast.makeText(this, "success04", Toast.LENGTH_SHORT).show();
            imagePath = uri.getPath();
        }
        displayImage(imagePath);
    }
    private void handleImageBeforeKitKat(Intent data) {
        Uri uri = data.getData();
        String imagePath = getImagePath(uri, null);
        displayImage(imagePath);
    }
    @SuppressLint("Range")
    private String getImagePath(Uri uri, String seclection) {
        String path = null;
        //通过Uri和secletion来获取真实的图片路径
        Cursor cursor = getContentResolver().query(uri, null, seclection, null, null);
        if(cursor != null) {
            if(cursor.moveToFirst()) {
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }
            cursor.close();
        }
        return path;
    }
    private void displayImage(String imagePath) {
        if(imagePath != null) {
            Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
            picture.setImageBitmap(bitmap);
        } else {
            Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT).show();
        }
    }
三 进行实现:
运行结果(手机上的结果):

对于相机调用和相册调用的优化以及定位地址进行识别优化_System

标签:调用,String,相册,data,uri,new,null,优化,out
From: https://blog.51cto.com/u_16078663/7418563

相关文章

  • 【笔记】在线凸优化 - Ch1. Introduction
    1.1TheOnlineConvexOptimizationSetting在线凸优化Onlineconvexoptimization(OCO),是一个带有博弈论、统计学习、凸优化的新玩意给出如下问题叙述:考虑一种博弈游戏,回合制,第\(t\in[T]\)回合,先由玩家从决策集\({\calK}\in\mathbb{R}^n\)中选择一个决策\({\bfx}......
  • delphi FireDAC 调用 Execute 提示 `[FireDAC][SQL Server Native Client 10.0]字符串
    FireDAC调用Execute提示[FireDAC][SQLServerNativeClient10.0]字符串数据,长度不匹配错误问题调用Execute向SQLServer数据库中批量插入数据时,参数中有BLOB数据类型(ftBlob、ftMemo等)时,出现[FireDAC][Phys][ODBC][Microsoft][SQLServerNativeClient10.0]字符串......
  • Linux下C语言调用libcurl库获取天气预报信息
    一、概述当前文章介绍如何在Linux(Ubuntu)下使用C语言调用libcurl库获取天气预报的方法。通过HTTPGET请求访问百度天气API,并解析返回的JSON数据,可以获取指定城市未来7天的天气预报信息。二、设计思路【1】使用libcurl库进行HTTPGET请求在代码中包含<curl/curl.h>头文件,以便使用libc......
  • Tomcat 部署及优化
    目录Tomcat部署及优化1.1概述1.2Tomcat核心组件1.2.1什么是Servlet?(JSP代码进行解释、转换、运行)1.2.2什么是JSP?(动态页面实现)1.3Tomcat功能组件结构1.4Tomcat处理请求过程1.5Tomcat多实例部署1.6Tomcat优化Tomcat部署及优化1.1概述Java语言开发的一款开放源代......
  • 空指针产生的条件 null对象调用属性
    null对象调用属性 e.gpublicclassStudent{Integerage;Stringname;Stringaddress;Useruser;}Studentstudent=newStudent();12:student.getUser().getName()Exceptioninthread"main"java.lang.NullPointerException atpatter......
  • 【Android 开发】金九银十斩获offer秘籍:简历优化+Android大厂面试真题
    前言面试是一场没有硝烟的战争,这句话看有点危言耸听,但是在面试中考验的确无处不在。金九银十已经开始一个星期了,在面试或准备面试的小伙伴如果你在面试中对面试官所问的问题感到有困难时,那说明是我们的基础功没打好,或者是对面试题了解的还不够多。如果是连面试邀约都没有的小伙伴,咱......
  • 大文件 MD5 SHA 校验时间优化之路
    最近研发apk校验服务,很多游戏安装包两三个G,如果整个拿去校验,耗时基本二十多秒,这还仅仅是校验的时间,如果加上下载的时间,等待时间太长了网上很多方案尝试了一下,不太行1、fastmd5一个第三方库,csdn有人用过说可以提升40%的速度,然后我去试了一下,本来9秒可以完成的校验,变成了2分多钟......
  • 网站优化搜索引擎与关键词
    网站优化搜索引擎与关键词人们不应该高估搜索引擎的智商。这不利于seo的研究,事实上,搜索引擎是非常愚蠢的,让我们举一个非常简单的例子,你在搜索引擎中输入“教师”这个词,搜索引擎就会给出一个准确的搜索列表。我们不会给出“教师”一词的检索信息,但我们认为,“教师”和“教师”的含义......
  • 【专题】电动汽车充电基础设施建设与运营的优化解决方案报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=336002022年,中国城市充电基础设施继续快速增长,总量从2021年的261.7万台增加到2022年的521万台,同比增幅超过99%。其中,私人充电桩的增加数量达到194.2万台,是公共充电桩增加数量的3倍,私人充电桩占比也从2021年的56.2%增加到2022年的65.5%。阅读原文,获......
  • 8月AI实战:工业视觉缺陷检测 --基于tflite的yolov8模型优化和推理
    8月AI实战:工业视觉缺陷检测--基于tflite的yolov8模型优化和推理操作视频见B站连接:aidlux模型优化+工业缺陷检测~~完美用我的华为手机实现缺陷检测的推理bilibiliaidlux模型优化+工业缺陷检测~~完美用我的华为手机实现缺陷检测的推理1模型优化将onnx模型转化为tflite模型打开网站......