博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android进阶之路 - 调用相册内照片
阅读量:648 次
发布时间:2019-03-15

本文共 9990 字,大约阅读时间需要 33 分钟。

本篇讲的是获取我们相册的照片,用于展示,包含获取对应的图片的存放地址

常见的图片选取方式分为俩种:

细致分为三个案例(可相互独立,找自己需要的即可):

  • 普通的相册照片回传,无其他要求
  • 相册照片回传,获取对应的Uri 与 图片的绝对路径
  • 通过已封装好的工具,快速实现以上操作

前期了解:

在满足照片回传的同时,你还可以获取Uri路径或绝对路径~

  • Uri路径:
uri = content://media/external/images/media/88484
  • 绝对路径:
path = /storage/emulated/0/Pictures/Screenshots/S70620-110151.jpg
  • 案例Log:
06-21 11:44:57.434 30071-30071/com.example.dow.photoup E/tag: uri = content://media/external/images/media/8848406-21 11:44:57.526 30071-30071/com.example.dow.photoup E/tag: path = /storage/emulated/0/Pictures/Screenshots/S70620-110151.jpg

注意:

案例2与案例3,MainAcitivity代码些许不同,Xml相同,案例3多了一个PhotoUtil的转换工具类

Effect 1:

这里写图片描述

案例 - 1

MainActivity:

package com.example.dow.cameraphoto;import android.content.ContentResolver;import android.content.Intent;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.provider.MediaStore;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.ImageView;import android.widget.TextView;import java.io.FileNotFoundException;public class MainActivity extends AppCompatActivity {
private ImageView mImg; private TextView mBtn; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtn = (TextView) findViewById(R.id.btn); mImg = (ImageView) findViewById(R.id.img); mBtn.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
startActivityForResult(new Intent(Intent.ACTION_PICK).setType("image/*"),0); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); ContentResolver contentResolver = getContentResolver(); Bitmap bitmap = null; try {
bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(data.getData())); Log.i("TAG", "从相册回传bitmap:"+bitmap); mImg.setImageBitmap(bitmap); } catch (FileNotFoundException e) {
e.printStackTrace(); } }}

MainActivity Xml:

/>

案例 - 2

MainActivity :

package com.example.dow.photoup;import android.content.ContentResolver;import android.content.Intent;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.media.ThumbnailUtils;import android.net.Uri;import android.os.Environment;import android.provider.MediaStore;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.ImageView;import android.widget.TextView;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;public class MainActivity extends AppCompatActivity {
private TextView mBtn; private TextView mPath; private TextView mUri; private ImageView mImage; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initEvent(); } private void initEvent() {
mBtn.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
//调用相册 startActivityForResult(new Intent(Intent.ACTION_PICK).setType("image/*"),0); } }); } private void initView() {
mBtn = (TextView) findViewById(R.id.btn); mPath = (TextView) findViewById(R.id.tv_path); mUri = (TextView) findViewById(R.id.tv_uri); mImage = (ImageView) findViewById(R.id.iv_bitmap); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); //应该是四大组件的内容提供者对应的内功接收者 ,必调方法 ContentResolver contentResolver = getContentResolver(); Bitmap bitmap = null; try {
if(requestCode == 0){
//图片的U Uri uri = data.getData(); Log.e("tag","uri = "+uri); mUri.setText("Uri地址:"+uri); //第一种方式 setImageBitmap(bitmap) - 与径相关 bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri); //返回图 mImage.setImageBitmap(bitmap); //图片压缩比例- 如在我们回传的照片比较模糊,我们可以注释上一行代码 解开下面这行代码// mImage.setImageBitmap(ThumbnailUtils.extractThumbnail(bitmap,100,100)); //第二种方式 setImageURI(uri) - 与Uri路径相关// mImage.setImageURI(uri); String[] proj = {
MediaStore.Images.Media.DATA }; //android多媒体数据库的封装接口 Cursor cursor = managedQuery(uri, proj, null, null, null); //图片角标 - 索引 int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); //重置角标,防止越界 cursor.moveToFirst(); // 最后根据索引值获取图片路径 String path = cursor.getString(column_index); Log.e("tag","path = "+path); mPath.setText("Path地址:"+path); } } catch (FileNotFoundException e) {
e.printStackTra`e(); } catch (IOException e) {
e.printStackTrace(); } }}

MainActivity Xml :

案例 - 3

MainActivity :

package com.example.dow.photoup;import android.content.ContentResolver;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.ImageView;import android.widget.TextView;public class MainActivity extends AppCompatActivity {
private TextView mBtn; private TextView mPath; private TextView mUri; private ImageView mImage; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initEvent(); } private void initEvent() {
mBtn.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
//调用相册 startActivityForResult(new Intent(Intent.ACTION_PICK).setType("image/*"),0); } }); } private void initView() {
mBtn = (TextView) findViewById(R.id.btn); mPath = (TextView) findViewById(R.id.tv_path); mUri = (TextView) findViewById(R.id.tv_uri); mImage = (ImageView) findViewById(R.id.iv_bitmap); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); //应该是四大组件的内容提供者对应的内功接收者 ,必调方法 ContentResolver contentResolver = getContentResolver(); Bitmap bitmap = null; try {
if(requestCode == 0){
//图片的U Uri uri = data.getData(); Log.e("tag","uri = "+uri); mUri.setText("Uri地址:"+uri); //返回图片 mImage.setImageURI(uri); //使用工具类获取绝对路径 String path= PhotoUtil.getFilePathFromContentUri(uri, contentResolver); Log.e("tag","path = "+path); mPath.setText("Path地址:"+path); } } catch (Exception e) {
e.printStackTrace(); } }}

MainActivity Xml:

最炫工具类来了,直接Copy!!!

photoUtil

package com.example.dow.photoup;import android.content.ContentResolver;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.net.Uri;import android.provider.MediaStore;/** * Created by YongLiu on 2017/6/21. */public class PhotoUtil {
/** * Uri 转 绝对路径 * */ public static String getFilePathFromContentUri(Uri selectedVideoUri, ContentResolver contentResolver) {
String filePath; String[] filePathColumn = {
MediaStore.MediaColumns.DATA}; Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null);// 也可用下面的方法拿到cursor // Cursor cursor = this.context.managedQuery(selectedVideoUri, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); filePath = cursor.getString(columnIndex); cursor.close(); return filePath; } /** * 绝对路径 转 Uri * */ public static Uri getImageContentUri(Context context, java.io.File imageFile) {
String filePath = imageFile.getAbsolutePath(); Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{
MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=? ", new String[]{
filePath}, null); if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID)); Uri baseUri = Uri.parse("content://media/external/images/media"); return Uri.withAppendedPath(baseUri, "" + id); } else {
if (imageFile.exists()) {
ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, filePath); return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } else {
return null; } } } }

转载地址:http://gwglz.baihongyu.com/

你可能感兴趣的文章