我想获取创建共享意图的应用程序名称或其包名称。我正在制作通过意图接收共享数据的应用程序,如何获取创建者应用程序的包名称?类似 [intent.getSourceBackageName()]
编辑: 我不确定我的问题是否清楚。但是我需要找出调用我的应用程序的名称,例如,如果我从浏览器共享,我需要找到一种方法来知道浏览器应用程序是与我共享数据的应用程序。
我想获取创建共享意图的应用程序名称或其包名称。我正在制作通过意图接收共享数据的应用程序,如何获取创建者应用程序的包名称?类似 [intent.getSourceBackageName()]
编辑: 我不确定我的问题是否清楚。但是我需要找出调用我的应用程序的名称,例如,如果我从浏览器共享,我需要找到一种方法来知道浏览器应用程序是与我共享数据的应用程序。
如何获取创建者应用程序的包名?
你不能。例如,可能没有“创建者应用程序”,因为ACTION_SEND
Intent
可以从命令行 ( adb shell am
) 发送。而且,由于ACTION_SEND
不与 一起使用startActivityForResult()
,因此 njzk2 的解决方案将不起作用。
获取启动 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
,除非您Activity
被调用startActivityForResult
鉴于可以在Intent
不包含您要查找的信息的情况下创建一个,因此无法保证能够提取它。但是,如果您检查所有以意图(探索)到达的字段,intent.getCategories
您可能会发现一些可用于解决某些情况的模式......
您可以使用 Activity 获取调用包,尝试:
getActivity().getCallingPackage()
使用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>
它给出了在其清单标签中定义的应用程序名称。
从 API 22 开始,此方法可用。它可能是空的,并且记录在案的也可以被欺骗,但它似乎是最好的选择 API 22+
这很简单
getPackageManager().getPackageInfo(getPackageName(), 0).packageName (或) MyContext.getPackageName()