Android自定義相機谭羔,添加水印

很多app都要求自定義一個相機,類似違章查詢拍照麦向,美圖相機之類的應(yīng)用都要求自定義相機瘟裸,網(wǎng)上的例子大多數(shù)我也看過,很多例子是有坑的诵竭,存在各種各樣的問題话告,常見的就是問題就是適配性很差兼搏,這里我分享一下我做的一個自定義相機,算是淺度實現(xiàn)吧沙郭,實現(xiàn)了拍照和保存和添加水印的功能佛呻,做過測試,三星S7病线,華為榮耀7吓著,oppoR9s,vivoY66都可以通過測試


截屏.jpg

好了下面直接上代碼吧送挑,關(guān)于坑點绑莺,會在代碼中注釋:

第一步,配置權(quán)限:


 <!-- 相機硬件的權(quán)限 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

第二步让虐,重寫一個surfaceview紊撕,并在onSrfacexxxx三個方法中罢荡,里面把預(yù)覽及相機初始化的一些工作做了

    public void surfaceCreated(SurfaceHolder holder) {
        Log.d(TAG, "surfaceCreated() is called");
        try {
            mCamera = Camera.open(0);
            mCamera.setDisplayOrientation(90);
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        Log.d(TAG, "surfaceChanged() is called");
        try {
            mCamera.autoFocus(new Camera.AutoFocusCallback() {
                @Override
                public void onAutoFocus(boolean success, Camera camera) {

                    isSuccess = success;
                    initCamera();
                    mCamera.cancelAutoFocus();
                    mCamera.startPreview();

                }
            });
        } catch (Exception e) {
            Log.d(TAG, "Error starting camera preview: " + e.getMessage());
        }
    }


    private void initCamera() {
        mParameters = mCamera.getParameters();
        mParameters.setPictureFormat(ImageFormat.JPEG);
        List<Camera.Size> pictureSizes = mParameters.getSupportedPictureSizes();
        Camera.Size picSize = null;
        WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        int screenWidth = display.getWidth();
        int screenHeight = display.getHeight();
        //相機支持的拍攝圖片尺寸赡突,拍照圖片尺寸小于等于屏幕尺寸,實現(xiàn)適配
        if (pictureSizes.size() > 1) {
            for (Camera.Size size2 : pictureSizes) {
                System.out.println("initCamera:" + size2.width + size2.height);
                if (size2.width * size2.height <= screenWidth * screenHeight) {
                    if (picSize == null) {
                        picSize = size2;
                    } else {
                        if ((size2.width * size2.height) > (picSize.width * picSize.height)) {
                            picSize = size2;
                        }
                    }
                }
            }
        } else {
            picSize = pictureSizes.get(0);
        }
        mParameters.setPictureSize(picSize.width, picSize.height);
        //設(shè)置尺寸以適配所有機型区赵,圖片尺寸小于等于屏幕尺寸惭缰,部分機型崩潰的問題得到了解決
        mParameters.setJpegQuality(99); // 設(shè)置照片質(zhì)量
        List<String> aa = mParameters.getSupportedFocusModes();
        //設(shè)置對焦模式,低端機型可能不支持快速對焦笼才,當(dāng)然現(xiàn)在大部分機型支持漱受,但是也得適配啊
        if (aa.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
            mParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);//快速對焦
        } else {
            mParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
        }

        try {
            mCamera.setParameters(mParameters);
            mCamera.startPreview();
        } catch (Exception e) {

        }


    }


    public void surfaceDestroyed(SurfaceHolder holder) {
        if (mCamera != null) {
            mCamera.setPreviewCallback(null);
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
        }
        Log.d(TAG, "surfaceDestroyed() is called");
    }

    //拍照
    public void takePicture(Camera.PictureCallback imageCallback) {
        Log.d(TAG, "takePicture: " + isSuccess);
        if (isSuccess) {
            mCamera.takePicture(null, null, imageCallback);
        } else {//如果不成功則重試對焦,否則拍出的照片可能糊
            initCamera();
            mCamera.cancelAutoFocus();
            mCamera.takePicture(null, null, imageCallback);

        }

    }




}

第三步骡送,在Activity中去實現(xiàn)拍照的操作:

//綁定surfaceView
 FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
        mCameraSurPreview = new SurfacePreview(this);
        preview.addView(mCameraSurPreview);
//拍照
mCameraSurPreview.takePicture(this);

附源碼地址:https://github.com/willShuhuan/MyDemos/blob/master/app/src/main/java/com/dsh/mydemos/activity/MyCameraActivity.java

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昂羡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子摔踱,更是在濱河造成了極大的恐慌虐先,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件派敷,死亡現(xiàn)場離奇詭異蛹批,居然都是意外死亡,警方通過查閱死者的電腦和手機篮愉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門腐芍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人试躏,你說我怎么就攤上這事猪勇。” “怎么了颠蕴?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵埠对,是天一觀的道長络断。 經(jīng)常有香客問我,道長项玛,這世上最難降的妖魔是什么貌笨? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮襟沮,結(jié)果婚禮上锥惋,老公的妹妹穿的比我還像新娘。我一直安慰自己开伏,他們只是感情好膀跌,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著固灵,像睡著了一般捅伤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巫玻,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天丛忆,我揣著相機與錄音,去河邊找鬼仍秤。 笑死熄诡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诗力。 我是一名探鬼主播凰浮,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼苇本!你這毒婦竟也來了袜茧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓣窄,失蹤者是張志新(化名)和其女友劉穎笛厦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體康栈,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡递递,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了啥么。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片登舞。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悬荣,靈堂內(nèi)的尸體忽然破棺而出菠秒,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布践叠,位于F島的核電站言缤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏禁灼。R本人自食惡果不足惜管挟,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弄捕。 院中可真熱鬧僻孝,春花似錦、人聲如沸守谓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斋荞。三九已至荞雏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間平酿,已是汗流浹背凤优。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留染服,地道東北人别洪。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓叨恨,卻偏偏與公主長得像柳刮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痒钝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容