系統中沒有郵件用戶端設定autoLink=email會掛掉的問題

來源:互聯網
上載者:User

  TextView的autoLink屬性為我們提供了很大的便利性,當文本中有網址,郵箱或電話的時候可以讓我們方便地執行打電話發郵件等動作,不過也有一些問題,比如說設定autoLink包含email屬性,當文本中有郵件地址時只要點擊就可以調用郵件用戶端來發郵件,但是如果當前系統中沒有郵件用戶端可供調用,程式會直接掛掉。

  通過看Log可以發現,系統拋出了ActivityNotFoundException異常,並且Exception的getMessage中包含"mailto:xxxx@xxx.xxx"字樣,當時第一反應是設定Thread.uncaughtExceptionHandler,判斷如果異常的類型是ActivityNotFoundException並且Error Message中有"mailto"字樣直接讓uncaughtException函數返回,試了一下,程式確實沒掛掉,竊喜中,但是接下來點擊了一下螢幕,5秒鐘後ANR了,好吧這個方法不行。

  又想到當點選連結後會調用郵件用戶端發郵件,肯定有startActivity的調用,於是重載Activity的startActivity函數,把參數 intent的內容打出來(直接toString()就行了),發現在Intent的內容是ACTIVION_VIEW,並有extra data:mailto:xxxx@xxx.xxx,所以就通過intent包含的資訊判斷如果包含mailto字樣就認為是系統調用郵件用戶端發郵件,此時判斷系統中是否有郵件用戶端可處理這個請求,如果沒有就把這個startActivity事件攔截下來。

  (intent.toString().indexOf("mailto") != -1) {         PackageManager pm =        List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0 (activities ==  || activities.size() == 0            

  代碼就是上面這樣,很簡單,提到了三種方法,第一種和第二種都是通過PackageManager判斷是否有可以處理這個Intent的請求的組件,如果沒有就直接讓startActivity返回,在返回之前你想幹嘛幹嘛,第三種方法是通過 Intent.createChoose手動彈出一個選取器,這個方法記得以前用是不行的,這次試了下竟然可以,難道是我記錯了?反正用前兩種方法就好了。

  不只是郵件,如果你想通過以下代碼跳轉到應用市場讓使用者為你的應用評分

Intent intent = "market://details?id=" +

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.