启动任何已安装的应用程序

时间:2014-03-27 16:09:26

标签: android android-intent android-package-managers

我有和app,用户可以滚动浏览所有已安装应用的列表,他可以选择任何应用并启动它。

对于大多数应用程序,这适用于:

startActivity(getPackageManager().getLaunchIntentForPackage(packageName_selectedapp));

其中packageName_selectedapp是列表中所选应用程序的字符串。

但对于某些应用程序,函数getLaunchIntentForPackage(packageName_selectedapp)返回“null”,例如,如果它是dialer或contacts活动。

如何获取拨号器和联系人的launchIntent?

提前thx!

2 个答案:

答案 0 :(得分:4)

  

如何获取拨号器和联系人的launchIntent?

那些不是应用程序。这些是另一个应用程序的其他可启动活动。

因此,你需要决定你写的是什么。

你说你有“所有已安装应用的列表,他可以选择任何应用并启动它”。在这种情况下,您特别不需要“拨号器和联系人”,因为这些不是应用程序。

相反,如果要显示用户可以从中选择的所有可启动活动的列表,则不会使用getLaunchIntentForPackage()。相反,您可以使用queryIntentActivities()来查找可启动的活动。我有a sample app that demonstrates this,以发射器的形式。

答案 1 :(得分:0)

某些应用程序(如壁纸)没有默认活动,也无法通过启动意图启动,但如果您的上下文正确,您应该能够使用常规意图。我不确定这是否适用于有问题的特定应用....

我会假设你制作另一个主屏幕或者rom,这就是你想要这个的原因吗?

这应该有帮助

联系人/人物应用 选择联系人

要让用户选择联系人并为您的应用提供对所有联系信息的访问权限,请使用ACTION_PICK操作并将MIME类型指定为Contacts.CONTENT_TYPE。

传递给onActivityResult()回调的结果包含指向所选联系人的内容:URI。即使您的应用不包含READ_CONTACTS权限,响应也会授予您的应用使用Contacts Provider API读取该联系人的临时权限。

提示:如果您只需要访问特定的联系信息,例如电话号码或电子邮件地址,请参阅下一节有关如何选择特定联系人数据的信息。

动作 ACTION_PICK 数据URI方案 没有 MIME类型 Contacts.CONTENT_TYPE 示例意图:

static final int REQUEST_SELECT_CONTACT = 1;

public void selectContact() {
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_SELECT_CONTACT);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) {
        Uri contactUri = data.getData();
        // Do something with the selected contact at contactUri
        ...
    }
}

有关如何在获得联系人URI后检索联系人详细信息的信息,请阅读检索联系人的详细信息。请记住,当您使用上述意图检索联系URI时,您不需要READ_CONTACTS权限来读取该联系人的详细信息。

选择特定的联系人数据

要让用户从联系人中选择特定信息,例如电话号码,电子邮件地址或其他数据类型,请使用ACTION_PICK操作并将MIME类型指定为下面列出的某种内容类型,例如作为CommonDataKinds.Phone.CONTENT_TYPE获取联系人的电话号码。

如果您只需要从联系人中检索一种类型的数据,那么使用ContactsContract.CommonDataKinds类中的CONTENT_TYPE的这种技术比使用Contacts.CONTENT_TYPE(如上一节所示)更有效,因为结果为您提供了直接访问所需数据,而无需对联系人提供程序执行更复杂的查询。

传递给onActivityResult()回调的结果包含指向所选联系人数据的内容:URI。即使您的应用不包含READ_CONTACTS权限,响应也会授予您的应用临时权限以读取该联系人数据。

动作 ACTION_PICK 数据URI方案 没有 MIME类型 CommonDataKinds.Phone.CONTENT_TYPE 从带有电话号码的联系人中挑选。 CommonDataKinds.Email.CONTENT_TYPE 从带有电子邮件地址的联系人中挑选 CommonDataKinds.StructuredPostal.CONTENT_TYPE 从带有邮政地址的联系人中挑选。 或者是ContactsContract下的许多其他CONTENT_TYPE值之一。

示例意图:

static final int REQUEST_SELECT_PHONE_NUMBER = 1;

public void selectContact() {
    // Start an activity for the user to pick a phone number from contacts
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType(CommonDataKinds.Phone.CONTENT_TYPE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) {
        // Get the URI and query the content provider for the phone number
        Uri contactUri = data.getData();
        String[] projection = new String[]{CommonDataKinds.Phone.NUMBER};
        Cursor cursor = getContentResolver().query(contactUri, projection,
                null, null, null);
        // If the cursor returned is valid, get the phone number
        if (cursor != null && cursor.moveToFirst()) {
            int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER);
            String number = cursor.getString(numberIndex);
            // Do something with the phone number
            ...
        }
    }
}

我会在这里推荐你

http://developer.android.com/guide/components/intents-common.html