您的位置:首页 > 移动开发 > Android开发

Android设备上获取图片

2015-08-26 21:29 489 查看
从相机和图库获取图片并裁剪

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

<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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: