【Android基礎】-調用前置攝像頭實現的‘手機鏡子’

前言:

鏡子是每個愛美的人必備的物品,但是並不是什麼時候都帶在身邊;手機也是每個人必備的物品,而且隨身攜帶,甚至連上廁所都不願放下;那麼是不是可以想辦法讓手機具有鏡子的功能呢?今天我們就來通過調用攝像頭實現一款手機鏡子,去掉手機照相機界面上多餘的設置部分,帶給大家一個乾乾淨淨的原生的鏡子。


主要代碼如下:

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();
        }
    }
}

源碼下載地址:http://download.csdn.net/detail/tailyou/9074561

發佈了56 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章