天天看點

[Android] 拍照、截圖、儲存并顯示在ImageView控件中

    最近在做android的項目,其中部分涉及到圖像處理的内容.這裡先講述如何調用camera應用程式進行拍照,并截圖和儲存顯示在imageview控件中以及遇到的困難和解決方法.

    ps:作者購買了本《android第一行代碼 著:郭霖》,參照裡面的内容完成(推薦該書,前面的布局及應用非常不錯).網上這類資料非常多,作者僅僅分享給初學者同時線上記錄些内容,希望對大家有所幫助.

   首先,設定activity_main.xml為linearlayout布局且 android:orientation="vertical"

   然後,在mainactivity.java檔案中public class mainactivity extends activity修改源代碼.添加自定義變量:

   添加函數實作點選拍照功能:

   通過startactivityforresult和onactivityresult方法實作拍照截圖和儲存功能:

由于涉及到sd卡中寫資料操作和camera操作,需要在androidmainfest.xml檔案中聲明權限:

    運作結果如下圖所示:

[Android] 拍照、截圖、儲存并顯示在ImageView控件中
[Android] 拍照、截圖、儲存并顯示在ImageView控件中

    需要注意以下幾個問題:

    1.拍照和截圖都涉及到startactivityforresult和onactivityresult的互動操作.

   其中onactivityresult的requestcode和startactivityforresult中的requestcode相對應.同時結合intent意圖實作拍照和截圖,核心代碼如下:(intent的參數設定省略)

    intent intent = new intent("android.media.action.image_capture");

    startactivityforresult(intent,take_photo);

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

    startactivityforresult(intent, crop_photo);

    2.使用android拍照儲存在系統相冊,圖庫不能立刻顯示最新照片.解決方法是發送系統内置的廣播去重新整理相冊實作顯示.代碼如下:

    可能你會使用下面這條廣播掃描整個sd卡,但4.4已禁止這樣的操作:

sendbroadcast(new intent(intent.action_media_mounted, uri.parse(...)))

    3.當運作程式是可能會發現結果圖像顯示很小,當通過一個intent意圖觸發時,camera程式不會将全尺寸圖像傳回給主調活動,這樣需要大量的記憶體,而移動裝置記憶體會有一定限制.通常camera将在傳回的意圖中傳回一幅很小的縮略圖,大圖可能會導緻oom問題.參考:《android多媒體開發進階程式設計 著:shawn van every》

    針對大圖像android提供bitmapfactory類,允許通過各種資源加載bitmap圖像.調用bitmapfactory.options類可以定義如何将bitmap讀入記憶體,當加載圖像時,可設定bitmapfactory采樣大小.并指定insamplesize參數表明加載時結果bitmap圖像所占的比例.如insamplesize=8表明産生一副大小為原始圖像1/8的圖像.參考下面代碼:

    4.使用nexus 4 剪裁圖檔後不能setimagebitmap顯示在imageview控件中,其中隻有儲存按鈕,沒有剪裁按鈕.測試發現沒有傳回result_ok.這個問題不能解決.why?

    最後希望文章對大家有所幫助,這是我學習android圖像處理部分的基礎性文章與解決過程.下載下傳位址:

<a target="_blank" href="http://download.csdn.net/detail/eastmount/8074833">http://download.csdn.net/detail/eastmount/8074833</a>

參考資料和推薦博文:(都是非常不錯的資料-.-)

    《android第一行代碼》著郭霖 參考8.3 調用攝像頭和相冊

    android高效加載大圖、多圖解決方案,有效避免程式oom by:guolin

繼續閱讀