Android进阶之路

来源:互联网 发布:hadoop推荐算法 编辑:程序博客网 时间:2024/05/22 01:45

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

在满足照片回传的同时,你还可以获取
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

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

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

注意:
案例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:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:orientation="vertical"    android:layout_height="match_parent"    tools:context="com.example.dow.cameraphoto.MainActivity">    <TextView        android:id="@+id/btn"        android:gravity="center"        android:padding="5dp"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="调用相册图片" />    <View        android:layout_width="match_parent"        android:layout_height="2dp"        android:background="#ff0"/>        />    <ImageView        android:layout_width="match_parent"        android:layout_weight="1"        android:id="@+id/img"        android:layout_height="0dp" /></LinearLayout>

案例 - 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 :

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:orientation="vertical"    android:layout_height="match_parent"    tools:context="com.example.dow.photoup.MainActivity">    <TextView        android:layout_width="match_parent"        android:gravity="center"        android:layout_height="wrap_content"        android:padding="5dp"        android:id="@+id/btn"        android:text="从相册调取图片" />    <TextView        android:layout_width="match_parent"        android:gravity="center"        android:layout_height="wrap_content"        android:padding="5dp"        android:id="@+id/tv_uri"        android:text="" />    <TextView        android:layout_width="match_parent"        android:gravity="center"        android:layout_height="wrap_content"        android:padding="5dp"        android:id="@+id/tv_path"        android:text="" />    <ImageView        android:layout_width="match_parent"        android:id="@+id/iv_bitmap"        android:layout_height="match_parent" /></LinearLayout>

案例 - 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:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:orientation="vertical"    android:layout_height="match_parent"    tools:context="com.example.dow.photoup.MainActivity">    <TextView        android:layout_width="match_parent"        android:gravity="center"        android:layout_height="wrap_content"        android:padding="5dp"        android:id="@+id/btn"        android:text="从相册调取图片" />    <TextView        android:layout_width="match_parent"        android:gravity="center"        android:layout_height="wrap_content"        android:padding="5dp"        android:id="@+id/tv_uri"        android:text="" />    <TextView        android:layout_width="match_parent"        android:gravity="center"        android:layout_height="wrap_content"        android:padding="5dp"        android:id="@+id/tv_path"        android:text="" />    <ImageView        android:layout_width="match_parent"        android:id="@+id/iv_bitmap"        android:layout_height="match_parent" /></LinearLayout>

最炫工具类来了,直接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;                    }               }      }  }
1 0