第一步: 添加相应的权限以及属性;
1在 manifest 中设置权限
- <uses-feature Android:name="android.hardware.camera" />
- <!-- 相机权限 -->
- <uses-permission Android:name="android.permission.CAMERA" />
- <!-- 写入 SD 卡的权限: 如果你希望保存相机拍照后的照片 -->
- <uses-permission Android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <!-- 读取 SD 卡的权限: 打开相册选取图片所必须的权限 -->
- <uses-permission Android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission Android:name="android.permission.CALL_PHONE"/>
2在 < application > 中设置相应属性, 这一步很关键, 解决了我在这一方面最后的一个有关 deny 的权限问题
- Android:requestLegacyExternalStorage="true"
- <!-- 如果 Target>28 则添加这一句代码 -->
- <!-- 这样就可以采用原有的存储策略了 -->
第二步: 制作一个简介的显示界面, 点击按钮, 然后选择图片
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:Android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- Android:id="@+id/activity_take_photo"
- Android:layout_width="match_parent"
- Android:layout_height="match_parent"
- >
- <Button
- Android:layout_width="match_parent"
- Android:layout_height="wrap_content"
- Android:text="take photo"
- Android:id="@+id/button"
- />
- <ImageView
- Android:id="@+id/imageview"
- Android:layout_width="105dp"
- Android:layout_height="111dp"
- Android:layout_below="@+id/button" />
- </RelativeLayout>
第三步: 编写主程序
- package com.example.test;
- import Android.Manifest;
- import Android.annotation.SuppressLint;
- import Android.annotation.TargetApi;
- import Android.App.Activity;
- import Android.content.ContentUris;
- import Android.content.Intent;
- import Android.content.pm.PackageManager;
- import Android.database.Cursor;
- import Android.graphics.Bitmap;
- import Android.graphics.BitmapFactory;
- import Android.NET.Uri;
- import Android.os.Bundle;
- import Android.os.Environment;
- import Android.os.StrictMode;
- import Android.provider.DocumentsContract;
- import Android.provider.MediaStore;
- import Android.view.View;
- import Android.widget.Button;
- import Android.widget.ImageView;
- import androidx.annotation.NonNull;
- import androidx.appcompat.App.AppCompatActivity;
- import androidx.core.App.ActivityCompat;
- import com.example.test.R;
- import.NET.tsz.afinal.FinalActivity;
- import.NET.tsz.afinal.annotation.view.ViewInject;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- // 使用 Afinal 框架
- public class MainActivity extends FinalActivity {
- // 获取相应组件
- @ViewInject(id = R.id.button , click = "get")
- Button button ;
- @ViewInject(id = R.id.imageview)
- ImageView imageView;
- // 程序的入口
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- // 这一两行代码主要是向用户请求权限
- if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
- }
- }
- // 相应点击事件
- public void get(View v){
- openSysAlbum();
- }
- // 重载 onActivityResult 方法, 获取相应数据
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- handleImageOnKitKat(data);
- }
- public static int ALBUM_RESULT_CODE = 0x999 ;
- /**
- * 打开系统相册
- * 定义 Intent 跳转到特定图库的 Uri 下挑选, 然后将挑选结果返回给 Activity
- * */
- private void openSysAlbum() {
- Intent albumIntent = new Intent(Intent.ACTION_PICK);
- albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
- startActivityForResult(albumIntent, ALBUM_RESULT_CODE);
- }
- // 这部分的代码目前没有理解, 只知道作用是根据条件的不同去获取相册中图片的 url
- // 这一部分是从其他博客中查询的
- @TargetApi(value = 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())) {
- String id = docId.split(":")[1];
- // 解析出数字格式的 id
- 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())) {
- // 如果是 content 类型的 Uri, 则使用普通方式处理
- imagePath = getImagePath(uri, null);
- } else if ("file".equalsIgnoreCase(uri.getScheme())) {
- // 如果是 file 类型的 Uri, 直接获取图片路径即可
- imagePath = uri.getPath();
- }
- // 根据图片路径显示图片
- displayImage(imagePath);
- System.out.println(imagePath);
- }
- /** 获取图片的路径 */
- private String getImagePath(Uri uri, String selection) {
- String path = null;
- Cursor cursor = getContentResolver().query(uri, null, selection, 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) {
- Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
- imageView.setImageBitmap(bitmap);
- }
- }
这样就实现了通过点击按钮, 然后在相册中选取图片, 从而显示在 ImageView 中, 效果就不演示了, 很简单的一个效果;
Android 小白, 欢迎见解与讨论, 大家一起进步与学习~
来源: https://blog.csdn.net/qq_42529944/article/details/105374121