Android MIUI系統調用拍照後不返回當前activity如何解決

來源:互聯網
上載者:User

最近在做一個Android下的所見即所得 (WYSIWYG)的編輯器,思路是利用內建瀏覽器webview的html5屬性contenteditable來實現,如:
<div id='con' class='con' contenteditable='true'>請輸入內容</div>。

在實際應用過程中,由於需要插入圖片,所以要支援利用網路攝影機拍照和從圖庫中的相簿選擇圖片的功能。從圖庫選圖沒有任何問題,但是拍照的時候,在小米的miui系統下就出現了其他機型沒有出現的bug。

我們先來看代碼,先寫調用camera的代碼:

    camera_picname="camera.jpg"; //照片名稱
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory()+defaultdir, camera_picname))); 
    startActivityForResult(intent, 10); 

注意,這裡我們使用了startActivityForResult,表明需要返回結果。

然後需要重寫當前activity的 onActivityResult 方法:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 10 && resultCode == Activity.RESULT_OK) {  /*拍照*/
     String imgpath = new File(Environment.getExternalStorageDirectory()+defaultdir, camera_picname).getAbsolutePath();
     try {
Thread.sleep(500); //延時毫秒 等待 WebView.loadUrl 非同步執行完畢
} catch (InterruptedException e) {
e.printStackTrace();
}
     mWebView.loadUrl("javascript:window.appendcon('"+imgpath+"');");
    }
}

另外,為了防止在調用相機的時候,當前activity被系統kill(比如記憶體不夠時,系統會自動銷毀非可見的處於onPause或onStop狀態的activity),我們需要 覆寫 onSaveInstanceState方法,儲存當前activity的狀態變數值。

/*儲存介面狀態,如果activity意外被系統killed,返回時可以恢複狀態值*/
@Override
public void onSaveInstanceState(Bundle savedInstanceState){
    savedInstanceState.putString("msg_con", htmlsource);
    savedInstanceState.putString("msg_camera_picname", camera_picname);
    super.onSaveInstanceState(savedInstanceState); //實現父類方法 放在最後 防止拍照後無法返回當前activity
}

然後在 onCreate(Bundle savedInstanceState) 方法裡,判斷savedInstanceState是否為null,不是null則讀取上次儲存的臨時變數值。

上面的整個流程在模擬器裡和其他型號的android真機裝置裡都沒有問題,唯獨紅米的手機有問題!出現這個問題的手機型號是紅米1S電信版,MIUI版本是: MIUI-JHCCNBF37.0,整合的Android版本是4.3 JLS36C;而這種情況在模擬器裡或其他手機上沒有發生。

具體問題:

點擊拍照按鈕,跳轉到拍照介面時,由於拍照程式是比較消耗系統資源的,一般這個時候,系統大多會調用onSaveInstanceState方法讓app儲存介面狀態值。

小米miui系統大多數時候也是正常調用 onSaveInstanceState 方法,當系統調用這個方法的時候,整個拍照流程,包括拍照後返回調用拍照的這個activity時,都是正常的。

但是,有些時候小米手機並沒有調用 onSaveInstanceState 方法,這個時候,拍照後直接退出了調用他的這個activity(該activity覆寫了onActivityResult方法),也就不會執行 onActivityResult方法。程式沒有任何其他異常。

飄易的猜測是:由於紅米miui深度定製了android系統,並且紅米是整個小米系裡最低端的入門機,在硬體效能上縮減嚴重。大白話就是修改了過多的模組而又沒有考慮周全產生的bug。當系統調用拍照程式時,系統認為當前的記憶體還夠用,activity不會被銷毀,所以沒有執行 onSaveInstanceState方法。但是拍照程式真正啟用後,系統發現記憶體不夠用了,即將OOM,就銷毀了處於onPause或onStop的activity。這個銷毀系統不會通知你,系統偷偷地幹了這件事。

 正常的情況下,即使系統銷毀了這個activity,在拍照返回到這個activity的時候,系統會重建被銷毀的這個activity,重走 onCreate 等方法。

然而小米的miui系統在這裡就有了bug!小米miui認為某個activity不會銷毀,所以直接忽略了由於意外,系統需要重新建立這個activity的可能性。因此直接導致了返回到了前前activity,而不是前activity。

當小米miui系統明確地認為這個activity可能會被銷毀時,執行 onSaveInstanceState 方法的時候,上面的這個bug不存在,系統在拍照完成後可以正常返回到前面的activity裡並執行裡面的 onActivityResult 方法。

目前,此bug沒修複。上面的是飄易個人淺見,歡迎高手評論。

順帶說一下,紅米手機的另外的bug:

一、有的時候在用手機瀏覽器訪問網頁或返回的時候,整個頁面沒有顯示完全,網頁上的部分元素顯示不全、斷層,必須手動重新整理當前頁,才能顯示全部頁面。

二、在開啟APP時,點擊按鈕返回時,比如拍照返回時,介面上的有些控制項是黑色的,必須手指滑過這些控制項,才能去掉黑色。

不知道其他小夥伴們,有沒有遇到如上bug。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.