天天看點

Android 相機的使用

今天小馬來講下在使用相機功能時如果正确的使用相機,因為小馬目前用的時候在

網上找了例子,但後來發現有很多相機導入之後就不能用了,我很郁悶的,再後來就

聽到群裡有人講到相機什麼MediaStore啊什麼的,這個類沒聽過,是以查了下,此

處再多說點東西,大家查東西的時候不用把類所屬的哪個包都記得清清楚楚的,還得

在API找半天,如果遇到什麼沒見過的類,可以直接在Android Developer裡面使用

search這個查詢框,不明白什麼就寫什麼進去:

<a target="_blank" href="http://blog.51cto.com/attachment/201112/023142804.png"></a>

現在,直接開始代碼,最後小馬會把我做的DEMO貼出來,供大家學習:

import java.io.ByteArrayOutputStream; 

import java.io.File; 

import android.app.Activity; 

import android.content.Intent; 

import android.graphics.Bitmap; 

import android.net.Uri; 

import android.os.Bundle; 

import android.os.Environment; 

import android.provider.MediaStore; 

import android.view.View; 

import android.view.View.OnClickListener; 

import android.widget.Button; 

import android.widget.Toast; 

/**   

* @Title: CameraTestActivity.java 

* @Package com.lvguo.www 

* @Description: 相機測試 

* @author MZH 

* @version V2.2   老樣子,寫個自己喜歡的版本号,友善日後維護 

*/ 

public class CameraTestActivity extends Activity { 

    private Button btn ; 

    private static final String IMAGE_UNSPECIFIED = "image/*"; 

    String kkk = null; 

    /** Called when the activity is first created. */ 

    @Override 

    public void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        setContentView(R.layout.main); 

        btn = (Button)findViewById(R.id.button1); 

        btn.setOnClickListener(new OnClickListener() { 

            @Override 

            public void onClick(View v) { 

                //第一次看見這個類,不認識,直接Android Developer裡面Search    

                //小馬英文不是很好,時刻在電腦上挂着詞典,也希望朋友們能準備一款自己喜愛的詞典 

                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

                //參數可直接在官方文檔裡面查到,是以朋友們練下手吧,自己查下EXTRA_OUTPUT 

                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri 

                        .fromFile(new File(Environment 

                                .getExternalStorageDirectory(), 

                                "mzh.jpg")));//temp為儲存照片的檔案名 

                //此處講幾句,類似這些方法,小馬建議直接在浏覽器下查,因為文檔查不到就說沒查到, 

                //有網情況下,會自動定位到Activity | Android Developers直接點就OK了 

                startActivityForResult(intent, 1); //這是個好東西哦 

                Toast.makeText(getApplicationContext(), "點選拍照", Toast.LENGTH_LONG).show(); 

            } 

        }); 

    } 

    /** 

     * 用來處理startActivityForResult傳回的資料,查此方法用老辦法 :直接在浏覽器下查 

     */ 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

        if (requestCode == 9) {  //此處的數字自己定,可随便   

            Bundle extras = data.getExtras(); 

            if (extras != null) { 

                Bitmap photo = extras.getParcelable("data"); 

                ByteArrayOutputStream stream = new ByteArrayOutputStream(); 

                //英語不好的朋友,拿工具查compress是什麼意思就明白了,小馬英語一般,是以此處多說一句,工具 

                photo.compress(Bitmap.CompressFormat.JPEG, 60, stream); 

                byte[] b = stream.toByteArray(); 

                //Base64Coder是一個剪切壓縮輔助類,裡面的東西我也看不懂,不過沒事,直接用,因為要用的方法不多,情況具體定 

                kkk = new String(Base64Coder.encodeLines(b)); 

        } 

        if(requestCode == 1){ 

            File picture = new File(Environment.getExternalStorageDirectory() 

                    + "/mzh.jpg"); 

            cutPic(Uri.fromFile(picture)); 

        super.onActivityResult(requestCode, resultCode, data); 

    public void cutPic(Uri uri) { 

        //下面這一句第一眼看到我不懂,沒事,直接Android Developer裡面Search  Intent  

        //熟悉下面Summary嗎?用工具查什麼意思,再找下它是什麼地方的,是官方文檔最右側頂端 的東西,裡面有個Ctros,點進去 

        //Summary: Nested Classes | Constants | Inherited Constants | Fields  

        //| Ctors | Methods | Inherited Methods | [Expand All] 

        //會發現有個構造方法:Intent(String action)。。。。再點進去,貼官方代碼: 

        /** 

         * public Intent (String action) 

        Since: API Level 1 

            Create an intent with a given action. All other fields (data, type, class) are null.  

            Note that the action must be in a namespace because Intents are used globally in  

            the system -- for example the system VIEW action is android.intent.action.VIEW;  

            an application's custom action would be something like com.google.app.myapp.CUSTOM_ACTION. 

        Parameters 

            &lt;看到這句了吧?ACTION_VIEW,不知道的可以再Search&gt; 

            action  The Intent action, such as ACTION_VIEW. 

             要再不明白的朋友可以直接在有網情況下直接把com.android.camera.action.CROP Search一下就OK了, 

             小馬查詢文檔的能力不強,是以在查詢這塊多說幾句 

         */ 

        Intent intent = new Intent("com.android.camera.action.CROP"); 

        intent.setDataAndType(uri, IMAGE_UNSPECIFIED); 

        intent.putExtra("crop", "true"); 

        // aspectX aspectY 是寬高的比例 

        intent.putExtra("aspectX", 1); 

        intent.putExtra("aspectY", 1); 

        // outputX outputY 是裁剪圖檔寬高 

        intent.putExtra("outputX", 150); 

        intent.putExtra("outputY", 150); 

        intent.putExtra("return-data", true); 

        startActivityForResult(intent, 9); 

好了,到目前為止,代碼已經貼完了,但有重要的一點,要在剛開始做東西時就應該想清楚自己需要什麼東西,有沒權限啊SD卡空間啊什麼問題的,是以,沒權限的不行,報錯,是以加上以下權限即可:

&lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt; 

   &lt;uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /&gt; 

   &lt;!-- 相機使用權限 --&gt; 

   &lt;uses-permission android:name="android.permission.CAMERA" /&gt;     

&lt;uses-feature android:name="android.hardware.camera" /&gt;      

&lt;uses-feature android:name="android.hardware.camera.autofocus" /&gt; 

這些權限網上都有,搜下拍照要什麼權限就可以了,如果你覺得沒太懂的話,就自己在小馬上傳的附件裡面打斷點跟下就知道是怎麼走的咯,很簡單的DEMO,但在網上找的相機都會有錯,是以自己試了下,可以了就貼出來,朋友們有好的方法可以指點小馬一下,三人行,必有我師,小馬知錯就改,吼吼,學習愉快!

<a href="http://down.51cto.com/data/2359470" target="_blank">附件:http://down.51cto.com/data/2359470</a>

     本文轉自華華世界 51CTO部落格,原文連結:http://blog.51cto.com/mzh3344258/741318,如需轉載請自行聯系原作者

繼續閱讀