Android 相册选择图片

如何实现从相册中选取图片
  • 1.运行时权限处理,申请WRITE_EXTERNAL_STORAGE这个危险权限,需要读写SD卡的能力

  • 2.申请成功则继续构建Intent对象,指定actionandroid.intent.action.GET_CONTENT。用setType()设置返回类型为图片

  • 3.调用startActivityForResult()隐式启动intent

  • 4.回调onActivityResult()判断图片是否成功返回,如果成功,对4.4以上系统采用handleImageOnKitkat(),对4.4以下系统采用handleImageBeforeKitkat()

  • 5.handleImageOnKitkat():

    • 返回的uri 如果是document类型,取出document id处理获取路径图片
      • 如果Uriauthoritymedia格式的话,document id 还要再一步处理才能获取路径图片
    • 不是的话则普通方式处理,直接获得路径图片
本项目在 26节调用摄像头项目的基础上修改
修改布局 增加选照片按钮
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/take_photo"
android:text="拍照"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/choose_photo"
android:text="选照片"/>

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/picture"
android:layout_gravity="center_horizontal"/>

</LinearLayout>
活动
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

private ImageView imageView;
private Button takePhoto;
private Button choosePhoto;
private Uri imageUri;
public static final int TAKE_PHOTO = 1;
public static final int CHOOSE_PHOTO = 2;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

imageView = findViewById(R.id.picture);
takePhoto = findViewById(R.id.take_photo);
choosePhoto = findViewById(R.id.choose_photo);
takePhoto.setOnClickListener(this);
choosePhoto.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.take_photo:
File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
if (outputImage.exists()) {
outputImage.delete();
}
try {
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= 24) {
imageUri = FileProvider.getUriForFile(MainActivity.this, getPackageName() + ".fileprovider", outputImage);
} else {
imageUri = Uri.fromFile(outputImage);
}
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_PHOTO);
break;
case R.id.choose_photo:
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(); //打开相册
}
break;
}
}

private void openAlbum() {
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
Log.d("test", "选择照片");
startActivityForResult(intent, CHOOSE_PHOTO);
}

//申请权限回调函数
@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(MainActivity.this, "申请权限被拒绝", Toast.LENGTH_SHORT).show();
}
break;
}
}

//活动跳转回调函数
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case TAKE_PHOTO: //拍照
if (resultCode == RESULT_OK) {
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} else {
Toast.makeText(MainActivity.this, "取消拍照", Toast.LENGTH_SHORT).show();
}
break;
case CHOOSE_PHOTO: //选照片
if (resultCode == RESULT_OK) {
if (Build.VERSION.SDK_INT >= 19) {
handleImageOnKitkat(data);
} else {
handleImageBeforeKitkat(data);
}
} else {
Toast.makeText(this, "未选择图片", Toast.LENGTH_SHORT).show();
}
break;
}
}
//android4.4以下使用
private void handleImageBeforeKitkat(Intent data) {
Uri uri = data.getData();
String imagePath = getImagePath(uri, null);
Log.d("test", "before" + imagePath);
displayImage(imagePath);
}

private String getImagePath(Uri externalContentUri, String selection) {
String path = null;
Cursor cursor = getContentResolver().query(externalContentUri, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}

//Android4.4以上使用
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private void handleImageOnKitkat(Intent data) {
String imagePath = null;
Uri uri = data.getData();
if (DocumentsContract.isDocumentUri(MainActivity.this, uri)) {
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
String id = docId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(contentUri, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
imagePath = getImagePath(uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
imagePath = uri.getPath();
}
Log.d("test", imagePath);
displayImage(imagePath);
}

private void displayImage(String imagePath) {
if (imagePath != null) {
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
imageView.setImageBitmap(bitmap);
} else {
Toast.makeText(this, "图片加载错误!", Toast.LENGTH_SHORT).show();
}
}
}

0%