首頁 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場(chǎng)

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

綜合交流 / 評(píng)測(cè) / 活動(dòng)區(qū)

交流區(qū) | 測(cè)硬件 | 網(wǎng)站活動(dòng) | Z幣中心

新手入門 / 進(jìn)階 / 社區(qū)互助

新手 | 你問我答 | 免費(fèi)刷機(jī)救磚 | ROM固件

查看: 10765|回復(fù): 0
上一主題 下一主題
[教程]

第三十六講:Android手機(jī)攝像頭編程入門

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
>  本講內(nèi)容:Android手機(jī)攝像頭編程入門智能手機(jī)中的攝像頭和普通手機(jī)中的攝像頭最大的區(qū)別在于,智能機(jī)上的攝像頭可以由程序員寫程序控制,做一些有趣的應(yīng)用譬如,畫中畫,做一些有用的應(yīng)用譬如二維碼識(shí)別,等等。本講打算通過一個(gè)實(shí)例,來介紹一下攝像頭編程,相關(guān)解釋都寫在代碼中了,請(qǐng)注意看代碼注釋。   
   
  實(shí)例:窈窈照相機(jī),功能很簡(jiǎn)單,就是點(diǎn)擊程序彈出照相預(yù)覽界面,點(diǎn)擊相機(jī)按鈕完成照相功能,所照相片會(huì)存儲(chǔ)在手機(jī)存儲(chǔ)卡根目錄。   
   
  1、創(chuàng)建一個(gè)項(xiàng)目 Lesson36_Camera ,主程序文件為 MainActivity.java2、AndroidManifest.xml 中設(shè)置屏幕為橫屏,并且聲明攝像頭和存儲(chǔ)卡的使用權(quán)限,具體代碼如下:   
   
   
4K">
  1. <?xml version="1.0" encoding="utf-8"?>   
    <manifest package="basic.android.lesson36" xmlns:android="http://schemas.android.com/apk/res/android" android:versioncode="1" android:versionname="1.0">   
            <application android:label="@string/app_name" android:icon="@drawable/icon">   
                    <activity android:label="@string/app_name" android:name=".MainActivity" android:screenorientation="landscape" android:configchanges="orientation|keyboardHidden|keyboard">   
                            <intent -filter="">   
                                    <action android:name="android.intent.action.MAIN">   
                                    <category android:name="android.intent.category.LAUNCHER">   
                            </category></action></intent>   
                    </activity>   
       
            </application>   
            <uses -sdk="" android:minsdkversion="8">   
            <uses -permission="" android:name="android.permission.CAMERA"></uses>   
            <uses -permission="" android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses>   
            <uses -feature="" android:name="android.hardware.camera">   
            <uses -feature="" android:name="android.hardware.camera.autofocus">   
    </uses></uses></uses></manifest>  
復(fù)制代碼
    3、本例中不需要布局文件main.xml,因?yàn)楸纠械腢I組建都是動(dòng)態(tài)添加上去的。   
   
  4、最后MainActivity.java的代碼如下:   
   
   
  1. package basic.android.lesson36;   
       
    import java.io.BufferedOutputStream;   
    import java.io.File;   
    import java.io.FileOutputStream;   
    import java.io.IOException;   
    import java.util.Calendar;   
    import java.util.Locale;   
       
    import android.app.Activity;   
    import android.content.Context;   
    import android.graphics.Bitmap;   
    import android.graphics.BitmapFactory;   
    import android.graphics.PixelFormat;   
    import android.hardware.Camera;   
    import android.os.Bundle;   
    import android.text.format.DateFormat;   
    import android.util.Log;   
    import android.view.KeyEvent;   
    import android.view.SurfaceHolder;   
    import android.view.SurfaceView;   
    import android.view.Window;   
    import android.view.WindowManager;   
    import android.widget.FrameLayout;   
    import android.widget.TextView;   
    import android.widget.Toast;   
       
    public class MainActivity extends Activity {   
       
            private CameraView cv;   
            //準(zhǔn)備一個(gè)相機(jī)對(duì)象   
            private Camera mCamera = null;   
            //準(zhǔn)備一個(gè)Bitmap對(duì)象   
            private Bitmap mBitmap = null;           
       
            //準(zhǔn)備一個(gè)保存圖片的PictureCallback對(duì)象   
            public Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {   
       
                    public void onPictureTaken(byte[] data, Camera camera) {   
                            Log.i("yao","onPictureTaken");   
                            Toast.makeText(getApplicationContext(), "正在保存……", Toast.LENGTH_LONG).show();   
                            //用BitmapFactory.decodeByteArray()方法可以把相機(jī)傳回的裸數(shù)據(jù)轉(zhuǎn)換成Bitmap對(duì)象   
                            mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);   
                            //接下來的工作就是把Bitmap保存成一個(gè)存儲(chǔ)卡中的文件   
                            File file = new File("/sdcard/YY"+ new DateFormat().format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg");   
                            try {   
                                    file.createNewFile();   
                                    BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file));   
                                    mBitmap.compress(Bitmap.CompressFormat.PNG, 100, os);   
                                    os.flush();   
                                    os.close();   
                                    Toast.makeText(getApplicationContext(), "圖片保存完畢,在存儲(chǔ)卡的根目錄", Toast.LENGTH_LONG).show();   
                            } catch (IOException e) {   
                                    e.printStackTrace();   
                            }   
                    }   
       
            };   
       
            //Activity的創(chuàng)建方法   
            @Override   
            public void onCreate(Bundle savedInstanceState) {   
                    super.onCreate(savedInstanceState);   
       
                    //窗口去掉標(biāo)題   
            requestWindowFeature(Window.FEATURE_NO_TITLE);   
            //窗口設(shè)置為全屏   
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);   
            //設(shè)置窗口為半透明   
            getWindow().setFormat(PixelFormat.TRANSLUCENT);   
       
            //提供一個(gè)幀布局   
            FrameLayout  fl = new FrameLayout(this);         
       
            //創(chuàng)建一個(gè)照相預(yù)覽用的SurfaceView子類,并放在幀布局的底層   
            cv = new CameraView(this);   
                    fl.addView(cv);   
       
                    //創(chuàng)建一個(gè)文本框添加在幀布局中,我們可以看到,文字自動(dòng)出現(xiàn)在了SurfaceView的前面,由此你可以在預(yù)覽窗口做出各種特殊效果   
                    TextView tv = new TextView(this);   
                    tv.setText("請(qǐng)按"相機(jī)"按鈕拍攝");   
                    fl.addView(tv);   
       
                    //設(shè)置Activity的根內(nèi)容視圖   
                    setContentView(fl);   
       
            }   
       
            //相機(jī)按鍵按下的事件處理方法   
            public boolean onKeyDown(int keyCode, KeyEvent event) {   
                    Log.i("yao","MainActivity.onKeyDown");   
                    if (keyCode == KeyEvent.KEYCODE_CAMERA) {   
                            if (mCamera != null) {   
                                    Log.i("yao","mCamera.takePicture");   
                                    //當(dāng)按下相機(jī)按鈕時(shí),執(zhí)行相機(jī)對(duì)象的takePicture()方法,該方法有三個(gè)回調(diào)對(duì)象做入?yún)?,不需要的時(shí)候可以設(shè)null   
                                    mCamera.takePicture(null, null, pictureCallback);   
                            }   
                    }   
                    return cv.onKeyDown(keyCode, event);   
            }   
       
            // 照相視圖   
            class CameraView extends SurfaceView {   
       
                    private SurfaceHolder holder = null;   
       
                    //構(gòu)造函數(shù)   
                    public CameraView(Context context) {   
                            super(context);   
                            Log.i("yao","CameraView");   
       
                            // 操作surface的holder   
                            holder = this.getHolder();   
                            // 創(chuàng)建SurfaceHolder.Callback對(duì)象   
                            holder.addCallback(new SurfaceHolder.Callback() {   
       
                                    @Override   
                                    public void surfaceDestroyed(SurfaceHolder holder) {   
                                            // 停止預(yù)覽   
                                            mCamera.stopPreview();   
                                            // 釋放相機(jī)資源并置空   
                                            mCamera.release();   
                                            mCamera = null;   
                                    }   
       
                                    @Override   
                                    public void surfaceCreated(SurfaceHolder holder) {   
                                            //當(dāng)預(yù)覽視圖創(chuàng)建的時(shí)候開啟相機(jī)   
                                            mCamera = Camera.open();   
                                            try {   
                                                    //設(shè)置預(yù)覽   
                                                    mCamera.setPreviewDisplay(holder);   
                                            } catch (IOException e) {   
                                                    // 釋放相機(jī)資源并置空   
                                                    mCamera.release();   
                                                    mCamera = null;   
                                            }   
       
                                    }   
       
                                    //當(dāng)surface視圖數(shù)據(jù)發(fā)生變化時(shí),處理預(yù)覽信息   
                                    @Override   
                                    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {   
       
                                            //獲得相機(jī)參數(shù)對(duì)象   
                                            Camera.Parameters parameters = mCamera.getParameters();   
                                            //設(shè)置格式   
                                            parameters.setPictureFormat(PixelFormat.JPEG);   
                                            //設(shè)置預(yù)覽大小,這里我的測(cè)試機(jī)是Milsstone所以設(shè)置的是854x480   
                                            parameters.setPreviewSize(854, 480);   
                                            //設(shè)置自動(dòng)對(duì)焦   
                                            parameters.setFocusMode("auto");   
                                            //設(shè)置圖片保存時(shí)的分辨率大小   
                                            parameters.setPictureSize(2592, 1456);   
                                            //給相機(jī)對(duì)象設(shè)置剛才設(shè)定的參數(shù)   
                                            mCamera.setParameters(parameters);   
                                            //開始預(yù)覽   
                                            mCamera.startPreview();   
                                    }   
                            });   
                            // 設(shè)置Push緩沖類型,說明surface數(shù)據(jù)由其他來源提供,而不是用自己的Canvas來繪圖,在這里是由攝像頭來提供數(shù)據(jù)   
                            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);   
                    }   
       
            }   
       
    }
復(fù)制代碼
  5、連接Milestone,編譯并運(yùn)行程序:悲劇的是,截圖只能看到黑黑的一片,無法截取到攝像頭傳輸過來SurfaceView信息,而在真機(jī)中是能看到預(yù)覽效果的。   
     
   
     
   
   

上一篇:android用戶界面之EditText教程實(shí)例匯
下一篇:主流UI設(shè)計(jì)

本版積分規(guī)則

Archiver|新帖|標(biāo)簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號(hào) )

網(wǎng)絡(luò)信息服務(wù)信用承諾書 | 增值電信業(yè)務(wù)經(jīng)營許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號(hào)

GMT+8, 2024-10-19 18:27 , Processed in 0.068616 second(s), 13 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報(bào):report#znds.com (請(qǐng)將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表