发表评论
效果图:
首先需要在AndroidManifest.xml文件中添加权限:
<!--在SDCard中创建与删除文件权限-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--请求访问使用照相设备-->
<uses-permission android:name="android.permission.CAMERA" />
<!--允许程序录制音频-->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--内外置sd卡写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
activity_test.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/camera"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="照相"
android:textColor="#FFFFFF"
android:background="#FF9000"
/>
<Button
android:id="@+id/gallery"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="相册"
android:textColor="#FFFFFF"
android:background="#FF9000"
/>
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
/>
</LinearLayout>
TestsActivity.java:
package com.lykuaimai.kuaimaid.ui.activity;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
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.support.v4.content.CursorLoader;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.lykuaimai.kuaimaid.R;
import com.lykuaimai.kuaimaid.utils.DateUtils;
import com.lykuaimai.kuaimaid.utils.FileUtils;
import java.io.File;
import java.util.Date;
/**
* Created by Administrator on 2015/7/26.
*/
public class TestsActivity extends Activity implements View.OnClickListener{
String savePath = "sdcard/kuaimaid/image/";
String tempFileName;//临时文件路径
String tempPhotoPath;//选择照片或者或拍照完成后保存的照片地址
private static final int PHOTO_REQUEST_CAMERA = 1;// 拍照
private static final int PHOTO_REQUEST_GALLERY = 2;// 从相册中选择
Button camera;
Button gallery;
ImageView image;
private Bitmap bitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
camera = (Button) findViewById(R.id.camera);
gallery = (Button) findViewById(R.id.gallery);
image = (ImageView) findViewById(R.id.image);
camera.setOnClickListener(this);
gallery.setOnClickListener(this);
}
/**
* 从相册获取
*/
public void gallery() {
// 激活系统图库,选择一张图片
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
}
/*
* 从拍照获取
*/
public void camera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 判断存储卡是否可以用,可用进行存储
tempFileName = DateUtils.getDataString2(new Date())+".png";
if (hasSdcard()) {
//设定拍照存放到自己指定的目录,可以先建好
File file = new File(savePath);
if(!file.exists()){
file.mkdirs();
}
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File(savePath, tempFileName)));
}
startActivityForResult(intent, PHOTO_REQUEST_CAMERA);
}
/**
返回结果处理
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
if (requestCode == PHOTO_REQUEST_GALLERY) {//相册
if (data != null) {
// 得到图片的全路径
Uri uri = data.getData();
tempPhotoPath = getRealPathFromURI(uri, this);
//根据自己的需求写压缩图片的大小
bitmap= compressImageFromFile(tempPhotoPath, 400f, 400f);
image.setImageBitmap(bitmap);//显示图片
}
} else if (requestCode == PHOTO_REQUEST_CAMERA) {//照相
/*
1.好些设备在调用系统相机照相后返回的 data为null
解决办法就是在调用相机之前先设定好照片的路径和名称,拍完后直接拿来用
2.如果图片地址没有图片存在,则表示没有进行照相
*/
tempPhotoPath = savePath + "/" + tempFileName;
File file = new File(tempPhotoPath);
if(file.isFile()){//判断是否有照相
bitmap= compressImageFromFile(tempPhotoPath,400f,400f);
image.setImageBitmap(bitmap);//显示图片
}
}
} catch (Exception e) {
e.printStackTrace();
}
super.onActivityResult(requestCode, resultCode, data);
}
/**
* 是否有sd卡
* @return
*/
public static boolean hasSdcard() {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return true;
} else {
return false;
}
}
/**
* 获取uri的文件地址
* @param contentUri
* @param context
* @return
*/
public String getRealPathFromURI(Uri contentUri,Context context) {
String[] proj = { MediaStore.Images.Media.DATA };
CursorLoader loader = new CursorLoader(context, contentUri, proj, null, null, null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
/**
* 压缩图片减少内存使用
* @param srcPath
* @param hh
* @param ww
* @return
*/
public static Bitmap compressImageFromFile(String srcPath,float hh,float ww) {
BitmapFactory.Options newOpts = new BitmapFactory.Options();
newOpts.inJustDecodeBounds = true;// 只读边,不读内容
Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
/*float hh = 300f;// 长
float ww = 300f;// 高*/
int be = 1;
if (w > h && w > ww) {
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) {
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0)
be = 1;
newOpts.inSampleSize = be;// 设置采样率
newOpts.inPreferredConfig = Bitmap.Config.ARGB_8888;// 该模式是默认的,可不设
newOpts.inPurgeable = true;// 同时设置才会有效
newOpts.inInputShareable = true;// 当系统内存不够时候图片自动被回收
bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
return bitmap;
}
/** 回收Bitmap的空间。 */
public void recyleBitmap(Bitmap bitmap) {
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
bitmap = null;
}
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.camera :
camera();//照相获取照片
break;
case R.id.gallery :
gallery();//相册获取照片
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
recyleBitmap(bitmap);//释放bitmap
}
}
写的内容包含了图片压缩,URI转换,自己手写的测试可用~