应用内打开其他应用的正确姿势

在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:512@163.com"));//发送目标
        intent.putExtra(Intent.EXTRA_EMAIL,new String[]{"123@qq.com","125553@qq.com"});//发送目标
        intent.putExtra(Intent.EXTRA_CC,new String[]{"321@qq.com","321654@qq.com"});//抄送人
        intent.putExtra(Intent.EXTRA_BCC,new String[]{"b321@qq.com","b321654@qq.com"});//密送人
        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);
        }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值