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

手机相册图片获取
1
2
3
4if (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
29private void openAlbum() {
//调用相册
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, IMAGE);
}
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
10jump_button.setOnClickListener(new View.OnClickListener() {
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
17AreaSearch 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逻辑。