前言:
鏡子是每個愛美的人必備的物品,但是並不是什麼時候都帶在身邊;手機也是每個人必備的物品,而且隨身攜帶,甚至連上廁所都不願放下;那麼是不是可以想辦法讓手機具有鏡子的功能呢?今天我們就來通過調用攝像頭實現一款手機鏡子,去掉手機照相機界面上多餘的設置部分,帶給大家一個乾乾淨淨的原生的鏡子。
主要代碼如下:
package com.tailyou.mirror;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.PowerManager;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.umeng.analytics.MobclickAgent;
import com.umeng.update.UmengUpdateAgent;
public class MainActivity extends Activity {
private Context mContext;
private Camera mCamera;
private PowerManager.WakeLock mWakeLock;
private Bitmap bmp;
private SurfaceView mSurfaceView;
private LinearLayout llBottom, llCamera, llSave, llShare;
private SurfaceHolder holder;
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
@Override
public void run() {
llBottom.setVisibility(View.GONE);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
initWakeLock();
initSurfaceView();
initBottomLayout();
//友盟自動更新
UmengUpdateAgent.update(this);
}
private void initBottomLayout() {
llBottom = (LinearLayout) findViewById(R.id.ll_bottom);
llCamera = (LinearLayout) findViewById(R.id.ll_camera);
llSave = (LinearLayout) findViewById(R.id.ll_save);
llShare = (LinearLayout) findViewById(R.id.ll_share);
// 拍照
llCamera.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
mCamera.autoFocus(new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean focused, Camera arg1) {
takePicture();
}
});
}
});
// 保存照片
llSave.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
ImageTool.saveImage(bmp, "MirrorPic", "mp", 100);
Toast.makeText(MainActivity.this, "照片保存成功",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "操作SDCard失敗,請檢查是否插入SD卡",
Toast.LENGTH_SHORT).show();
}
llSave.setVisibility(View.GONE);
llShare.setVisibility(View.GONE);
handler.postDelayed(runnable, 5000);
mCamera.startPreview();
}
});
// 分享照片
llShare.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri
.fromFile(ImageTool.saveImage(bmp, "MirrorPic", "mp",
100)));
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "分享照片"));
llSave.setVisibility(View.GONE);
llShare.setVisibility(View.GONE);
handler.postDelayed(runnable, 5000);
mCamera.startPreview();
}
});
}
private void initSurfaceView() {
mSurfaceView = (SurfaceView) findViewById(R.id.mSurfaceView);
holder = mSurfaceView.getHolder();
// 添加回調監聽
holder.addCallback(new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
stopPreviewAndReleaseCamera();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
mCamera.setDisplayOrientation(90);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
setCameraParametersAndStartPreview(holder);
}
});
// SurfaceView觸摸監聽,實現隱藏或顯示底部操作欄
mSurfaceView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
if (llBottom.isShown()) {
llBottom.setVisibility(View.GONE);
} else {
llBottom.setVisibility(View.VISIBLE);
handler.postDelayed(runnable, 5000);
}
return false;
}
});
}
// 停止預覽並釋放相機
private void stopPreviewAndReleaseCamera() {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
private void setCameraParametersAndStartPreview(SurfaceHolder holder) {
try {
Camera.Parameters parameters = mCamera.getParameters();
// 設置預覽照片大小
parameters.setPreviewSize(ScreenUtils.getScreenWidth(mContext),
ScreenUtils.getScreenHeight(mContext));
// 設置預覽照片時每秒顯示多少幀最小值和最大值
parameters.setPreviewFpsRange(4, 10);
// 設置圖片格式
parameters.setPictureFormat(PixelFormat.RGB_565);
// 設置照片大小
parameters.setPictureSize(ScreenUtils.getScreenWidth(mContext),
ScreenUtils.getScreenHeight(mContext));
mCamera.setParameters(parameters);
// 通過SurfaceView顯示取景畫面
mCamera.setPreviewDisplay(holder);
// 開始預覽
mCamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
// 拍照
private void takePicture() {
if (mCamera != null) {
mCamera.takePicture(new ShutterCallback() {
@Override
public void onShutter() {
// TODO 當用戶按下快門時執行此處的代碼
}
}, new PictureCallback() {
@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
// TODO 當相機獲取原始照片時執行此處代碼,可在此處保存原始照片信息
}
}, new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera arg1) {
// 此處根據拍照所得數據創建位圖
bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
llSave.setVisibility(View.VISIBLE);
llShare.setVisibility(View.VISIBLE);
}
});
// 拍完照片後取消所有隱藏底部操作欄的Runnable
handler.removeCallbacks(runnable);
// 設置底部操作欄可見
llBottom.setVisibility(View.VISIBLE);
}
}
// 初始化電源鎖
private void initWakeLock() {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
"MainActivity");
}
@Override
protected void onResume() {
super.onResume();
// 友盟統計代碼
MobclickAgent.onResume(this);
// 獲取電源鎖,以避免黑屏
mWakeLock.acquire();
}
@Override
protected void onPause() {
super.onPause();
// 友盟統計代碼
MobclickAgent.onPause(this);
// 釋放電源鎖
if (mWakeLock != null) {
mWakeLock.release();
}
}
}