package com.lan.nicehair.activity;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Vibrator;
import android.provider.MediaStore;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
import com.lan.nicehair.R;
import com.lan.nicehair.utils.ImageUtil;
import com.lan.nicehair.widget.CameraPreview;
import com.lan.nicehair.widget.CameraPreview.OnCameraStatusListener;
/**
* 自定义的拍照界面
* @author lanyj
*
*/
public class CameraActivity extends BaseActivity implements OnCameraStatusListener{
public static final Uri IMAGE_URI = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
public static final String PATH = Environment.getExternalStorageDirectory()
.toString() + "/Camera/";//拍照完后图片保存目录
@InjectView(R.id.camera_surfaceView) CameraPreview mCameraPreview;//拍照预览
@OnClick(R.id.back)
public void onBackClicked(View v) {
finish();
}
@OnClick(R.id.change_camera)
public void onChangeCameraClicked(View v) {
//切换镜头
mCameraPreview.changeCameraFacing();
}
@OnClick(R.id.take_pictureIv)
public void onTakePhotoClicked(View v) {
mCameraPreview.takePicture();
}
private MediaPlayer mediaPlayer;
private boolean playBeep;
private static final float BEEP_VOLUME = 0.10f;
private static final long VIBRATE_DURATION = 200L;
private boolean vibrate;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.my_camera);
ButterKnife.inject(this);
mCameraPreview.setOnCameraStatusListener(this);
}
/**
* 存储图像并将信息添加入媒体数据库
*/
private Uri insertImage(ContentResolver cr, String name, long dateTaken,
String directory, String filename, Bitmap source, byte[] jpegData) {
OutputStream outputStream = null;
String filePath = directory + filename;
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 6;
options.inDither = false;
options.inPurgeable = true;
options.inInputShareable = true;
options.inTempStorage = new byte[32 * 1024];
options.inPreferredConfig = Bitmap.Config.RGB_565;
if(source==null&&jpegData!=null) {
source = BitmapFactory.decodeByteArray(jpegData, 0, jpegData.length, options);
}
boolean isHeadCamera=false;
if(mCameraPreview.cameraPosition==0) {
isHeadCamera=true;
}
Bitmap bMapRotate=ImageUtil.changeRoate(source,isHeadCamera);
File dir = new File(directory);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(directory, filename);
if (file.createNewFile()) {
outputStream = new FileOutputStream(file);
if (bMapRotate != null) {
bMapRotate.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
if (bMapRotate != null) {
bMapRotate.recycle();
bMapRotate = null;
}
}
// else {
// outputStream.write(jpegData);
// }
}
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (Throwable t) {
}
}
}
ContentValues values = new ContentValues(7);
values.put(MediaStore.Images.Media.TITLE, name);
values.put(MediaStore.Images.Media.DISPLAY_NAME, filename);
values.put(MediaStore.Images.Media.DATE_TAKEN, dateTaken);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.DATA, filePath);
return cr.insert(IMAGE_URI, values);
}
/**保存拍照后图像
*/
private Uri saveCameraMix(Bitmap newBitmap) {
Uri uri=null;
// 系统时间
long dateTaken = System.currentTimeMillis();
// 图像名称
String filename = DateFormat.format("yyyy-MM-dd kk.mm.ss", dateTaken)
.toString() + ".jpg";
// 存储图像(PATH目录)
uri = insertImage(getContentResolver(), filename, dateTaken, PATH,
filename, newBitmap, null);
return uri;
}
/**初始化照相声音文件
*/
private void initBeepSound() {
if (playBeep && mediaPlayer == null) {
// The volume on STREAM_SYSTEM is not adjustable, and users found it
// too loud,
// so we now play on the music stream.
setVolumeControlStream(AudioManager.STREAM_MUSIC);
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnCompletionListener(beepListener);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
setMediaResorce();
}
}
private void setMediaResorce() {
try {
mediaPlayer.reset();
Uri cameraUri = Uri.parse("file:///system/media/audio/ui/camera_click.ogg");
mediaPlayer.setDataSource(CameraActivity.this,cameraUri);
mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
mediaPlayer.prepare();
} catch (Exception e) {
mediaPlayer = null;
}
}
/**播放声音
*/
private void playBeepSound() {
if (playBeep && mediaPlayer != null) {
mediaPlayer.start();
}
playVibrate();
}
private void playVibrate() {
if (vibrate) {
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
vibrator.vibrate(VIBRATE_DURATION);
}
}
/**
* 监听声音播放完成
*/
private final OnCompletionListener beepListener = new OnCompletionListener() {
public void onCompletion(MediaPlayer mediaPlayer) {
mediaPlayer.seekTo(0);
}
};
@Override
public void onCameraStopped(byte[] data) {
// TODO Auto-generated method stub
Log.e("onCameraStopped", "==onCameraStopped==");
String picPath=null;
try {
// 创建图像
BitmapFactory.Options newOpts = new BitmapFactory.Options();
newOpts.inDither = false;
newOpts.inPurgeable = true;
newOpts.inInputShareable = true;
newOpts.inTempStorage = new byte[100 * 1024];//100k缓存
newOpts.inPreferredConfig = Bitmap.Config.RGB_565;
//newOpts.inSampleSize=3;
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,newOpts);
boolean isHeadCamera=false;
if(mCameraPreview.cameraPosition==0) {
isHeadCamera=true;
}
Bitmap bitTemp=ImageUtil.changeRoate(bitmap,isHeadCamera);
Uri uri=saveCameraMix(bitTemp);
picPath=ImageUtil.getPicPathFromUri(uri, this);
if(bitTemp!=null)
bitTemp.recycle();
} catch (Exception e) {
// TODO: handle exception
}
Intent intent=getIntent();
intent.putExtra("path", picPath);
setResult(Activity.RESULT_OK, intent);
finish();
}
@Override
public void onAutoFocus(boolean success) {
// TODO Auto-generated method stub
playBeepSound();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
playBeep = true;
AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);
if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
playBeep = false;
}
initBeepSound();
}
}