【问题标题】:Get package name for the application share intent获取应用程序共享意图的包名称
【发布时间】:2013-04-03 12:07:52
【问题描述】:

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

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

【问题讨论】:

  • 不,不是。我的情况不同,因为我从其他应用程序(如 Facebook 应用程序)收到了意图。所以我不能把'来自'额外!
  • 实际上,是的。我指出的问题包含几个答案,其中一个解释说只有通过使用 startActivityForResult、使用 getCallingActivity() 或 getCallingPackage() 进行调用时才能获取调用包。

标签: android


【解决方案1】:

如何获取创建者应用程序的包名?

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

【讨论】:

  • 可能确实没有“创建者应用程序”,但这并不意味着意图永远不能包含有关其创建者的信息。在这种情况下,该信息可能丢失/未设置/为空/为空。
【解决方案2】:

获取启动 Activity 的应用程序包名称:

/**
 * 
 * @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();
}

获取启动 Activity 的应用名称:

/**
 * 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-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 -> 撰写新邮件并选择“附加文件” -> 选择测试应用。

getCallingAppName(this) 返回文档

getCallingPackageName(this) 返回com.android.documentsui


在我的例子中,它返回的是 Documents 而不是 Gmail,因为 Gmail 默认会打开 Documents。因此,您应该考虑到可能无法真正了解原始应用程序,结果将始终为null,除非您的ActivitystartActivityForResult 调用

【讨论】:

  • 我实际上通过类似于你的意图过滤器从我的活动中调用它,并使用 startACtivityForResult() 启动它,但是 getCallingPackage 和 getCallingActivity 都返回 null..
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    getActivity().getCallingPackage()
    

    【讨论】:

      【解决方案5】:

      使用 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)");
      

      它给出了在其清单的&lt;application&gt; 标记中定义的应用程序名称。

      【讨论】:

      • Mycontext.getPackageName().toString();
      • 他的问题不同,他想获取调用他应用的应用的包名。
      【解决方案6】:

      从 API 22 开始,此 method 可用。它可能是空的,并且记录在案的也可以被欺骗,但它似乎是最好的选择 API 22+

      【讨论】:

        【解决方案7】:

        很简单

        getPackageManager().getPackageInfo(getPackageName(), 0).packageName (or) MyContext.getPackageName()

        【讨论】:

        • 这给了我我的应用程序包。我需要获取创建意图的源应用程序。例如,facebook 与我共享一些数据,我想知道 facebook 是共享数据的应用程序
        • 我回到你提到的问题,但是知道包是否存在对我有帮助吗?
        猜你喜欢
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-15
        相关资源
        最近更新 更多