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

  TextView的autoLink屬性爲咱們提供了很大的便利性,當文本中有網址,郵箱或電話的時候可讓咱們方便地執行打電話發郵件等動做,不過也有一些問題,好比說設置autoLink包含email屬性,當文本中有郵件地址時只要點擊就能夠調用郵件客戶端來發郵件,可是若是當前系統中沒有郵件客戶端可供調用,程序會直接掛掉。ide

  經過看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事件攔截下來。this

@Override
public void startActivity(Intent intent) {
    if (intent.toString().indexOf("mailto") != -1) { // Any way to judge that this is to sead an email
        PackageManager pm = getPackageManager();
        // The first Method
        List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
        if (activities == null || activities.size() == 0) {
            // Do anything you like, or just return
            return;
        }
 
        // Another method
        // ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
        // if (resolveInfo == null)
 
        // Yet another metod
        // Intent.createChooser(intent, "Choose email client");
    }
    super.startActivity(intent);
}

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

  不僅是郵件,若是你想經過如下代碼跳轉到應用市場讓用戶爲你的應用評分code

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=" + getPackageName()));
startActivity(intent);

  若是用戶系統中沒有安裝任何應用市場,很不幸,你的程序同樣會掛掉,和前面說的email同樣的問題:ActivityNotFoundException,不知道Google爲何不處理一下,也許人家覺得手機上怎麼可能沒有郵件客戶端和應用市場,不瞭解中國國情啊,不知道若是沒有電話應用會是什麼樣?沒有應用市場的處理是同樣的方法,重載startActivity,只要你能判斷這個請求是跳往市場的就好了。不過這個已經有了Intent對象,直接判斷就好了,判斷到沒有市場直接不startActivity。對象

相關文章
相關標籤/搜索