Android设备上获取图片
2015-08-26 21:29
489 查看
从相机和图库获取图片并裁剪
由于数据装换时用到了外部存储,要添加外部数据读写的权限
调用启动相机:
调用图库:
调用图像裁剪界面:
MainActivity.java
activity_main.xml
AndroidManifest.xml
由于数据装换时用到了外部存储,要添加外部数据读写的权限
<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>
相关文章推荐
- android基础篇(一)Activity的生命周期
- 技术小黑屋----深入讲解Android中Activity launchMode
- Android周报
- android连接wifi相关知识
- Android环境变量配置【ANDROID_SDK_HOME】
- gdb调试Android-5.1版本JNI模块
- Android 数据存储---File内部存储
- Android内存泄露检测利器---LeakCanary
- Activity之间信息传递(参数传递)
- Android学习0826<八>(GridView、Spinner、AutoCompleteTextView、Gallery、ExpandableListView)
- Android-主题样式基本方式
- Android学习之四样式、主题、shape、回调
- Android Native层Binder.transact()函数调用 Binder.onTransact() 函数失败分析
- Android-有序广播简单例子
- Android 扫描wifi局域网ip
- android01-快速入门
- android 飞行模式分析
- 安装Android Studio结束时提示VT is not enabled in the system
- 如何紧跟android开发的潮流
- Android-服务与广播实现简单电话录音