版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ToOak_And/article/details/51445921
MainActivity:
package com.example.xushuailong.mydopicture;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.xushuailong.mydopicture.utils.Utilty;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class MainActivity extends FragmentActivity implements View.OnClickListener {
private static final int REQUEST_CODE_PICK_IMAGE = 0;
private static final int REQUEST_CODE_CAPTURE_CAMERA = 1;
private static final int REQUEST_CODE_REL_CAPTURE_CAMERA = 2;
private static final int REQUEST_CODE_CROP_CAPTURE_CAMERA = 3;
// private static final int REQUEST_CODE_CROP_PICK_IMAGE = 3;
private Button btn_get_from_album, btn_get_from_camera, btn_get_rel_from_camera, btn_get_crop_from_camera, btn_get_crop_from_album;
private String ima_path;
private TextView txt_img_path;
private ImageView img;
private String rel_ima_path;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_PICK_IMAGE){
//相册
if (null != data) {
Uri uri = data.getData();
Log.d("xsl", "image_uri:" + uri);
String img_path = Utilty.getPathFromKitKat(getApplicationContext(), uri);
todoImageWithPatn(img_path);
}
}else if (requestCode == REQUEST_CODE_CAPTURE_CAMERA) {
//相机
if (null != data) {
Uri uri = data.getData();
Log.d("xsl", "camera_uri:" + uri);
if (uri == null) {
Bundle bundle = data.getExtras();
if (bundle != null) {
Bitmap photo = (Bitmap) bundle.get("data");
saveImage(photo, ima_path);
} else {
Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_SHORT).show();
}
} else {
//TODO do find the path of pic by uri
}
}
}else if (requestCode == REQUEST_CODE_REL_CAPTURE_CAMERA){
if (null != data){
Log.d("xsl", "data_extra: " + data.getExtras());
}else {
Log.d("xsl", "data is null !");
}
todoImageWithPatn(rel_ima_path);
}else if (requestCode == REQUEST_CODE_CROP_CAPTURE_CAMERA) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(Uri.fromFile(new File(rel_ima_path)), "image/*");
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(rel_ima_path)));
startActivityForResult(intent, REQUEST_CODE_REL_CAPTURE_CAMERA);
}
}
private void todoImageWithPatn(String ima_path) {
txt_img_path.setText("path: " + ima_path);
// img.setImageDrawable(Drawable.createFromPath(ima_path));
try {
img.setImageDrawable(Drawable.createFromStream(new FileInputStream(ima_path),System.currentTimeMillis()+"ss.jpg"));
} catch (Exception e) {
e.printStackTrace();
}
}
private void saveImage(Bitmap photo, String ima_path) {
// img.setImageBitmap(photo);
File file = new File(ima_path);
if (!file.exists()){
file.mkdirs();
}
BufferedOutputStream out = null;
try {
file = new File(ima_path + File.separator + System.currentTimeMillis() +".jpg");
file.createNewFile();
out = new BufferedOutputStream(new FileOutputStream(file.getPath(),false));
Log.d("xsl","image_path: "+file.getPath());
photo.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
todoImageWithPatn(file.getPath());
} catch (Exception e) {
e.printStackTrace();
}finally {
if (null != out){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
viewEvents();
}
private void initViews() {
btn_get_crop_from_album = (Button) findViewById(R.id.btn_get_crop_from_album);
btn_get_crop_from_camera = (Button) findViewById(R.id.btn_get_crop_from_camera);
btn_get_from_album = (Button) findViewById(R.id.btn_get_from_album);
btn_get_from_camera = (Button) findViewById(R.id.btn_get_from_camera);
btn_get_rel_from_camera = (Button) findViewById(R.id.btn_get_rel_from_camera);
txt_img_path = (TextView) findViewById(R.id.txt_img_path);
img = (ImageView) findViewById(R.id.img);
}
private void viewEvents() {
btn_get_crop_from_album.setOnClickListener(this);
btn_get_crop_from_camera.setOnClickListener(this);
btn_get_from_album.setOnClickListener(this);
btn_get_from_camera.setOnClickListener(this);
btn_get_rel_from_camera.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_get_from_album:{
getImageFromAlbum();
break;
}
case R.id.btn_get_from_camera:{
getImageFromCamera();
break;
}
case R.id.btn_get_rel_from_camera:{
getRelImageFromCamera();
break;
}
case R.id.btn_get_crop_from_camera:{
getCropImageFromCamera();
break;
}
case R.id.btn_get_crop_from_album:{
getCropImageFromAlbum();
break;
}
}
}
public void getImageFromAlbum() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");//相片类型
startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
}
public void getImageFromCamera() {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)){
ima_path = Environment.getExternalStorageDirectory().getPath() + "/imge_temp/";
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intent,REQUEST_CODE_CAPTURE_CAMERA);
}else {
Toast.makeText(getApplicationContext(),"请确认已插入SD卡",Toast.LENGTH_SHORT).show();
}
}
public void getRelImageFromCamera(){
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)){
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
String out_file_path = Environment.getExternalStorageDirectory().getPath() + "/imge_temp/rel_image";
File dir = new File(out_file_path);
if (!dir.exists()){
dir.mkdirs();
}
rel_ima_path = out_file_path + File.separator + System.currentTimeMillis() + ".jpg";
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(rel_ima_path)));
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(intent, REQUEST_CODE_REL_CAPTURE_CAMERA);
}
}
public void getCropImageFromCamera() {
String out_img_path = Environment.getExternalStorageDirectory().getPath() + "/imge_temp/crop_image";
File dir = new File(out_img_path);
if (!dir.exists()){
dir.mkdirs();
}
rel_ima_path = out_img_path + File.separator + System.currentTimeMillis() + ".jpg";
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new File(rel_ima_path)));
startActivityForResult(intent,REQUEST_CODE_CROP_CAPTURE_CAMERA);
}
public void getCropImageFromAlbum() {
String out_img_path = Environment.getExternalStorageDirectory().getPath() + "/imge_temp/crop_chose";
File dir = new File(out_img_path);
if (!dir.exists()){
dir.mkdirs();
}
rel_ima_path = out_img_path + File.separator + System.currentTimeMillis() + ".jpg";
// Intent intent = new Intent("android.intent.action.GET_CONTENT");
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
intent.putExtra("crop", true);
// intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new File(rel_ima_path)));
startActivityForResult(intent,REQUEST_CODE_REL_CAPTURE_CAMERA);
}
}
utils:
package com.example.xushuailong.mydopicture.utils;
import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
@TargetApi(Build.VERSION_CODES.KITKAT)
public class Utilty {
/**
* 在android4.4上获取资源的路径
*
* @param context
* @param uri
* @return
*/
public static String getPathFromKitKat(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/"
+ split[1];
}
// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"),
Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[] { split[1] };
return getDataColumn(context, contentUri, selection,
selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
public static String getDataColumn(Context context, Uri uri,
String selection, String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = { column };
try {
cursor = context.getContentResolver().query(uri, projection,
selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri
.getAuthority());
}
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri
.getAuthority());
}
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri
.getAuthority());
}
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri
.getAuthority());
}
}
activity_layout::
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.xushuailong.mydopicture.MainActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_get_from_album"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="get pic from album"/>
<Button
android:id="@+id/btn_get_crop_from_album"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="get crop pic from album"/>
<Button
android:id="@+id/btn_get_from_camera"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="get pic from camera"/>
<Button
android:id="@+id/btn_get_rel_from_camera"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="get rel pic from camera"/>
<Button
android:id="@+id/btn_get_crop_from_camera"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="get crop pic from camera"/>
<TextView
android:text="img_path: "
android:maxLines="2"
android:id="@+id/txt_img_path"
android:layout_width="match_parent"
android:layout_height="48dp" />
<ImageView
android:src="@mipmap/ic_launcher"
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitCenter"/>
</LinearLayout>
</RelativeLayout>
这部分程序功能的bug是,当从相册选择的图片或拍照的图片太大的时候,ImageView就显示不出来图片,有待于进一步的优化。。。。