本文共 9990 字,大约阅读时间需要 33 分钟。
本篇讲的是获取我们相册的照片,用于展示,包含获取对应的图片的存放地址
常见的图片选取方式分为俩种:
细致分为三个案例(可相互独立,找自己需要的即可):
前期了解:
在满足照片回传的同时,你还可以获取Uri路径或绝对路径~
uri = content://media/external/images/media/88484
path = /storage/emulated/0/Pictures/Screenshots/S70620-110151.jpg
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/