获取应用程序共享意图的包名称

时间:2013-04-03 12:07:52

标签: android

我想获取创建共享意图的应用程序名称或其包名称。我正在制作通过意图接收共享数据的应用程序,我怎样才能获得创建者应用程序的包名?像[intent.getSourceBackageName()]

这样的东西

修改 我不确定我的问题是否清楚。但是我需要找出调用我的应用程序的名称,例如,如果我从浏览器共享,我需要找到一种方法来了解浏览器应用程序是与我共享数据的应用程序。

7 个答案:

答案 0 :(得分:2)

  

我怎样才能获得创建者应用程序的包名?

你做不到。例如, 可能不是“创建者应用程序”,因为ACTION_SEND Intent可以从命令行发送( adb shell am )。而且,由于ACTION_SEND未与startActivityForResult()一起使用,因此njzk2的解决方案无效。

答案 1 :(得分:2)

获取启动您的活动的应用的包名:

/**
 * 
 * @param activity
 * @return The calling application's package name or {@code null} if the activity was not
 *         started with {@link #startActivityForResult}
 */
public static String getCallingPackageName(Activity activity) {
    return activity.getCallingPackage();
}

获取启动您的活动的应用名称:

/**
 * Get the name of the app that started this Activity.
 * 
 * @param activity
 * @return The calling application's app name or {@code null} if the activity was not started
 *         with {@link #startActivityForResult}
 */
public static String getCallingAppName(Activity activity) {
    final String packageName = activity.getCallingPackage();
    if (packageName == null) {
        return null;
    }
    final PackageManager pm = activity.getPackageManager();
    try {
        return pm.getApplicationInfo(packageName, 0).loadLabel(pm).toString();
    } catch (NameNotFoundException ignored) {
    }
    return null;
}

备注:

使用以下intent过滤器创建活动进行测试:

<intent-filter>
    <action android:name="android.intent.action.GET_CONTENT" />

    <data android:mimeType="*/*" />

    <category android:name="android.intent.category.OPENABLE" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

已打开Gmail - &gt;撰写新消息并选择“附加文件” - &gt;选择了测试应用程序。

getCallingAppName(this)返回了文档

getCallingPackageName(this)返回 com.android.documentsui


在我的情况下,它返回了Documents而不是Gmail,因为默认情况下Gmail会打开文档。所以,你应该考虑到真的不可能真正了解原始应用,结果总是null,除非你Activity使用startActivityForResult调用

答案 2 :(得分:1)

鉴于可以在不包含您要查找的信息的情况下创建Intent,因此无法保证能够提取它。但是,如果您检查带有意图到达的所有字段(探索intent.getCategories),您可能会发现一些可用于解决某些情况的模式......

答案 3 :(得分:0)

使用 PackageManager

final PackageManager packagemanager = getApplicationContext().getPackageManager();
ApplicationInfo app;
try {
    app = packagemanager.getApplicationInfo( this.getPackageName(), 0);

} catch (final NameNotFoundException e) {
    app= null;
}

 String applicationName = (String) (app!= null ? packagemanager.getApplicationLabel(app) : "(unknown)");

它提供了其清单的<application>标记中定义的应用程序名称。

答案 4 :(得分:0)

启动API 22,此method可用。它可能是null,并且记录也可能是欺骗性的,但它似乎是最好的选择API 22 +

答案 5 :(得分:0)

您可以使用您的Activity调用包,请尝试:

getActivity().getCallingPackage()

答案 6 :(得分:-2)

这很简单

getPackageManager()。getPackageInfo(getPackageName(),0).packageName (或) MyContext.getPackageName()