Android设备上获取图片

从相机和图库获取图片并裁剪


由于数据装换时用到了外部存储,要添加外部数据读写的权限

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


调用启动相机:

				//调用系统图库
				Intent intent = new Intent(Intent.ACTION_GET_CONTENT);//新建一个内容选择界面的Intent
				intent.setType("image/*");//设置Intent选择的文件类型
				startActivityForResult(intent, GALLERY_REQUEST_CODE);

调用图库:

				//调用系统图库
				Intent intent = new Intent(Intent.ACTION_GET_CONTENT);//新建一个内容选择界面的Intent
				intent.setType("image/*");//设置Intent选择的文件类型
				startActivityForResult(intent, GALLERY_REQUEST_CODE);

调用图像裁剪界面:

    	Intent intent = new Intent("com.android.camera.action.CROP");//建立图像裁剪页面的Intent
    	intent.setDataAndType(uri, "image/*");//设置数据和类型
    	intent.putExtra("crop", true);//设置开启的Intent中显示的View为可裁剪的
    	intent.putExtra("aspectX", 1);//裁剪的宽高比例,这里设为1:1
    	intent.putExtra("aspectY", 1);
    	intent.putExtra("outputX", 150);//裁剪的宽和高,也是我们得到的最终输出图片的宽和高
    	intent.putExtra("outputY", 150);
    	intent.putExtra("return-data", true);//设置裁剪后的图片是通过Intent返回回来的
    	startActivityForResult(intent, CROP_REQUEST_CODE);
完整代码:

MainActivity.java

package com.duduhali.avatar;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio.Media;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;


public class MainActivity extends Activity {
	final int CAMERA_REQUEST_CODE = 1;//拍照功能请求码
	final int GALLERY_REQUEST_CODE = 2;//图库请求码
	final int CROP_REQUEST_CODE = 3;//图像裁剪请求码
	Button bt_camera,bt_gallery;
	ImageView iv_avater;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt_camera = (Button)findViewById(R.id.button1);
        bt_gallery = (Button)findViewById(R.id.button2);
        iv_avater = (ImageView)findViewById(R.id.imageView1);
        bt_camera.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				//调用系统的拍照功能
				Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
				startActivityForResult(intent, CAMERA_REQUEST_CODE);
			}
		});
        bt_gallery.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				//调用系统图库
				Intent intent = new Intent(Intent.ACTION_GET_CONTENT);//新建一个内容选择界面的Intent
				intent.setType("image/*");//设置Intent选择的文件类型
				startActivityForResult(intent, GALLERY_REQUEST_CODE);
			}
		});
    }
    //图片保存在本地,并file类型的Uri,需添加外部存储的读写权限
    private Uri saveBitmap( Bitmap bm ){
    	File tmpDir = new File(Environment.getExternalStorageDirectory()+"/com.duduhali.avater");
    	if( !tmpDir.exists() ){
    		tmpDir.mkdir();//建立一个可用的临时文件夹目录
    	}
    	File img = new File(tmpDir.getAbsolutePath()+"duduhali.png");//建立临时文件
	
		try {
			FileOutputStream fos = new FileOutputStream(img);
			bm.compress(Bitmap.CompressFormat.PNG, 85, fos);//三个参数分别是:压缩格式(建立的文件类型对应),图片质量,写入的输出流
			fos.flush();
			fos.close();
			return Uri.fromFile(img);//产生一个file类型的Uri返回
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	return null;
    }
    //content类型Uri转化为file类型的Uri
    private Uri convertUri( Uri uri ){
    	InputStream is = null;
    	try {
			is = getContentResolver().openInputStream(uri);
			Bitmap bitmap = BitmapFactory.decodeStream(is);//从InputStream生产Bitmap数据类型
			is.close();
			return saveBitmap(bitmap);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	return null;
    }
    //启动图像裁剪页面
    private void startImageZoom(Uri uri){
    	Intent intent = new Intent("com.android.camera.action.CROP");//建立图像裁剪页面的Intent
    	intent.setDataAndType(uri, "image/*");//设置数据和类型
    	intent.putExtra("crop", true);//设置开启的Intent中显示的View为可裁剪的
    	intent.putExtra("aspectX", 1);//裁剪的宽高比例,这里设为1:1
    	intent.putExtra("aspectY", 1);
    	intent.putExtra("outputX", 150);//裁剪的宽和高,也是我们得到的最终输出图片的宽和高
    	intent.putExtra("outputY", 150);
    	intent.putExtra("return-data", true);//设置裁剪后的图片是通过Intent返回回来的
    	startActivityForResult(intent, CROP_REQUEST_CODE);
    }
    
    @Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if( requestCode == CAMERA_REQUEST_CODE ){//从相机返回
			if(data == null){//判断用户点击是否是取消
				return;
			}else{
				Bundle extras = data.getExtras();
				if(  extras != null ){
					Bitmap bm = extras.getParcelable("data");//获取相机返回的图片
					Uri uri = saveBitmap(bm);
					startImageZoom(uri);//启动图片裁剪界面
				}
			}
		}else if( requestCode == GALLERY_REQUEST_CODE ){//从图库返回
			if( data == null ){//判断用户点击是否是取消
				return;
			}else{
				Uri uri = data.getData();//返回的是content类型的Uri,congtent的类型的Uri不能直接进行复制等操作
				Uri fileUri = convertUri(uri);//转化为
				startImageZoom(fileUri);//启动图片裁剪界面
			}
		}else if( requestCode == CROP_REQUEST_CODE ){
			if( data == null ){//判断用户点击是否是取消
				return;
			}else{
				Bundle extras = data.getExtras();
				if( extras == null ){
					return;
				}else{
					Bitmap bm = extras.getParcelable("data");//获取图像裁剪界面返回的图片
					iv_avater.setImageBitmap(bm);//显示图片
				}
			}
		}
	}
}

activity_main.xml

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.duduhali.avatar.MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="从相机获取" />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button1"
        android:text="从图库获取" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button2"
        android:layout_centerHorizontal="true"
         />

</RelativeLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.duduhali.avatar"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值