天天看點

應用内打開其他應用的正确姿勢

在Android開發的過程中,不可能需要的時候都自己開發,往往通過打開其他的應用實作需要的效果,如拍照、發短信、發郵件、撥号等等。那麼我們如何打開其他的應用呢?

這個簡單,打電話:

Intent intent = new Intent();
        intent.setAction(Intent.ACTION_DIAL);
        Uri uri = Uri.parse("tel:15319903194");
        intent.setData(uri);
        startActivity(intent);
           

很簡單嘛。

真是這麼簡單嗎 ?

這個在我們使用的時候之是以都是正常的,主要原因是每個手機都有打電話的功能,但是我們在打開諸如發郵件、地圖等的時候還能這樣嗎?如果手機上沒有郵箱程式或者地圖程式會發生什麼?。

程式會崩潰!

是的,你的應用已經停止運作。

那麼我們應該如何避免這種情況呢?

那就是需要在啟動之前判斷下是不是存在能執行此Intent的程式。

PackageManager manager = getPackageManager();
        List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        boolean isIntentSafe = resolveInfos.size() > 0;     
        if (isIntentSafe) {
            startActivity(intent);
        }
           

這樣做就不會出現崩潰的現象了,還可以在else的時候對使用者進行友好的提示操作。

下面我們看看打開應用的正确姿勢。

一、建構程式打開的Intent,設定相關的Uri,Action,額外資訊等。

二、檢查系統是否存在能執行此操作的應用,如果存在則執行,不存在進行友好的提示。

三、如果需要則對應用選擇器進行定義。

第一點,很明确,對自己的Intent進行定制化,這裡不再多說,最後會附上常用的設定。

第二點,就是上面的解決辦法。

第三點,如果滿足此操作的應用有多個,則系統會顯示預設的應用選擇器,注意此選擇器是可以設定預設的。

打開網頁、打開文本、地圖這些選擇預設是沒有問題呢。

但如果是分享等操作呢,這次分享到QQ,下次分享到微信這時候如果點了預設下次怎麼辦?是以需要對選擇器進行設定,去除預設的設定,如下:

Intent chooser = Intent.createChooser(intent, "請選擇要使用的應用")
           

文字為選擇器的标題,啟動Activity的時候傳入chooser即可實作設定。

最後附上常用的打開其他程式的設定:

1、打電話:

Intent intent = new Intent();
        intent.setAction(Intent.ACTION_DIAL);
        Uri uri = Uri.parse("tel:15319903194");
        intent.setData(uri);
        PackageManager manager = getPackageManager();
        List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        boolean isIntentSafe = resolveInfos.size() > 0;
        if (isIntentSafe) {
            startActivity(intent);
        }
           

2、打開網站:

Uri uri = Uri.parse("http://www.java1234.com");
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        Intent chooser = Intent.createChooser(intent, "請選擇要使用的應用");//提示使用者需要選擇的應用,隻有一個的時候不起作用
        PackageManager manager = getPackageManager();
        List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        boolean isIntentSafe = resolveInfos.size() > 0;
        if (isIntentSafe) {
            startActivity(chooser);
        }
           

3、打開地圖:

Uri location = Uri.parse("geo:38.899533,-77.036476");
        Intent intent = new Intent(Intent.ACTION_VIEW, location);
        PackageManager manager = getPackageManager();
        List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        boolean isIntentSafe = resolveInfos.size() > 0;
        if (isIntentSafe) {
            startActivity(intent);
        }
           

4、發郵件:

Intent intent = new Intent(Intent.ACTION_SENDTO);
        intent.setData(Uri.parse("mailto:[email protected]"));//發送目标
        intent.putExtra(Intent.EXTRA_EMAIL,new String[]{"[email protected]","[email protected]"});//發送目标
        intent.putExtra(Intent.EXTRA_CC,new String[]{"[email protected]","[email protected]"});//抄送人
        intent.putExtra(Intent.EXTRA_BCC,new String[]{"[email protected]","[email protected]"});//密送人
        intent.putExtra(Intent.EXTRA_SUBJECT,"E-mail标題");
        intent.putExtra(Intent.EXTRA_TEXT,"E-mail内容E-mail内容E-mail内容E-mail内容E-mail内容");

        PackageManager manager = getPackageManager();
        List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        boolean isIntentSafe = resolveInfos.size() > 0;
        if (isIntentSafe) {
            startActivity(intent);
        }
           

5、建立月曆活動(此處要判斷系統版本,必須是API14及以上):

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH){
            Toast.makeText(this,"目前系統版本過低,不支援此功能",Toast.LENGTH_LONG).show();
            return;
        }
        Intent intent = new Intent(Intent.ACTION_INSERT, CalendarContract.Events.CONTENT_URI);
        Calendar beginTime = Calendar.getInstance();
        beginTime.set(2015, 0, 19, 7, 30);
        Calendar endTime = Calendar.getInstance();
        endTime.set(2015, 0, 19, 10, 30);
        intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
        intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
        intent.putExtra(CalendarContract.Events.TITLE, "活動标題");
        intent.putExtra(CalendarContract.Events.EVENT_LOCATION, "活動說明");

        PackageManager manager = getPackageManager();
        List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        boolean isIntentSafe = resolveInfos.size() > 0;
        if (isIntentSafe) {
            startActivity(intent);
        }
           

6、發短信:

Uri uri = Uri.parse("smsto:10086");
        Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
        intent.putExtra("sms_body", "短信内容");

        PackageManager manager = getPackageManager();
        List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        boolean isIntentSafe = resolveInfos.size() > 0;
        if (isIntentSafe) {
            startActivity(intent);
        }
           

7、搜尋:

Intent intent = new Intent();
        intent.setAction(Intent.ACTION_WEB_SEARCH);
        intent.putExtra(SearchManager.QUERY,"搜尋的内容");

        PackageManager manager = getPackageManager();
        List<ResolveInfo> resolveInfos = manager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        boolean isIntentSafe = resolveInfos.size() > 0;
        if (isIntentSafe) {
            startActivity(intent);
        }