Boooil's BLOG.

图像特征匹配开发手记Vol_9

2021/02/04 Share

获取手机相册图片及模块组合


  • 手机相册图片获取

    1
    2
    3
    4
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
    ActivityCompat.requestPermissions(this, perms, IMAGE);
    }

    动态获取手机的权限。

    仅仅在Manifest中加入静态权限声明是不行的,一种方法是手动在手机设置应用权限管理中开启需要的权限,另一种方法便是使用上述代码动态获取权限。

    光动态申请权限还不够,还需要在Manifest中的<application>标签下加上如下代码:

    1
    android:requestLegacyExternalStorage="true"

    原理尚未研究。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    private void openAlbum() {
    //调用相册
    Intent intent = new Intent(Intent.ACTION_PICK,
    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent, IMAGE);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //获取图片路径
    if (requestCode == IMAGE && resultCode == Activity.RESULT_OK && data != null) {
    Uri selectedImage = data.getData();
    String[] filePathColumns = {MediaStore.Images.Media.DATA};
    Cursor c = getContentResolver().query(selectedImage, filePathColumns, null, null, null);
    c.moveToFirst();
    int columnIndex = c.getColumnIndex(filePathColumns[0]);
    imagePath = c.getString(columnIndex);
    System.out.println("imagePath:"+imagePath);
    showImage(imagePath);
    c.close();
    }
    }
    //加载图片
    private void showImage(String imaePath){
    img = (ImageView)findViewById(R.id.album_img);
    Bitmap bm = BitmapFactory.decodeFile(imaePath);
    bm = Bitmap.createScaledBitmap(bm,960,540,true);
    img.setImageBitmap(bm);
    }

    这里的openAlbum()创建了一个新的intent,跳转至打开手机图库,onActivityResult便是跳转之后要进行进行的操作。imagePath便是用户选择的图片路径。showImage(String imaePath)是一个功能函数,它将图片加载到imageview控件上。

  • Intent跳转

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    jump_button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent = new Intent(getApplicationContext(),TestActivity.class);
    //传值给下一个Activity
    intent.putExtra("extra_data", imagePath);
    //启动Intent
    startActivity(intent);
    }
    });

    对跳转按钮绑定监听器,跳转至匹配模块,并转递imagePath参数。

  • Intent接收

    1
    2
    3
    4
    //获取上一个Activity传过来的值
    Intent intent = getIntent();
    User_FileName = intent.getStringExtra("extra_data");
    System.out.println("获取上一个Activity传过来的值:"+User_FileName);
  • 修改File_list预处理模块

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    AreaSearch areaSearch = new AreaSearch();
    FileName fileName = new FileName();

    List<District> district_list = areaSearch.Creat_District();
    LatLng location = new LatLng(40.005835,116.359258);
    int district_num = areaSearch.getDistrict(location,district_list);
    System.out.println("当前坐标区号"+district_num);

    String FilePath = "pic_set/"+Integer.toString(district_num);
    System.out.println("当前目录名:"+FilePath);

    List<String> File_list = new ArrayList<String>(fileName.getFilesAllName(FilePath,this));

    File_list.add(0, String.valueOf(district_num));
    //File_list.add(0,"/assets/pic_set/2/BoyDorm_1.jpg");//用户传入图片
    File_list.add(0,User_FileName);//用户传入图片
    task.execute(File_list);

    将用户传入图片路径的内容改成由前一个Intent传来的参数。(原来测试时是提前写好的路径名)

  • AsyncTask部分的小修改

    1
    2
    //Bitmap src_bitmap1= BitmapFactory.decodeStream(getClass().getResourceAsStream(TestFile_Path));
    Bitmap src_bitmap1= BitmapFactory.decodeFile(TestFile_Path);

    原来通过路径获取bitmap所用方法是getResourceAsStream,这个函数用于调用assests文件夹下的图片。现在图片来自于手机,所以改用decodeFile


至此,整个项目的基本流程已经搭建完成。

目前需要解决的问题是完善数据集制定并完善评分机制完善UI逻辑