最近在做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檔案中聲明權限:
運作結果如下圖所示:
需要注意以下幾個問題:
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