我有一个特定的 Intent (NDEF_DISCOVERED
),其中一些我无法正确处理,所以我想将它们重定向到 android 的默认 nfc 处理程序。
所以我接受了 Intent ,setComponent(null)
,然后是startActivity(intent)
但是..它总是在 Intent 抛出的无限循环中返回到我的应用程序。
有没有一种方法可以将 Intent 发送给除我的应用之外的任何人?或者将它发送到 android 的默认 nfc 处理程序?
编辑: 所以我使用 vikram 的回答来查询 packagemanager 可能的 Activity 来处理我的 Intent ,然后循环并找到具有最高优先级的 Activity (不是我)并向他们发送明确的 Intent 。
最佳答案
在这种情况下,自定义选择器对话框/弹出窗口更适合您。不要启动 Intent ,而是使用 PackageManager
至 queryIntentActivities(Intent, int)
.来自List<ResolveInfo>
那queryIntentActivities(Intent, int)
返回,使用 packageName
筛选出您自己的应用程序:
String packageName = "";
for(ResolveInfo resInfo : resolvedInfoList) {
packageName = resInfo.activityInfo.applicationInfo.packageName;
// Exclude `packageName` from the dialog/popup that you show
}
编辑 1:
以下代码将创建并显示 PopupWindow
每当showList()
叫做。用于返回 popupView
的 xml 布局文件只包含 LinearLayout
(R.layout.some_popup_view):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/llPopup"
android:orientation="vertical" >
</LinearLayout>
这段代码只是一个简单的演示。为了使其接近可用,您可能需要添加 ListView
使用此 PopupWindow
的自定义适配器.在OnClickListener
对于 ListView
,您将检索用户单击的应用程序的包名称,并生成启动该 Activity 的 Intent 。截至目前,代码仅显示如何使用自定义选择器过滤掉您自己的应用程序。在if
block ,替换 "com.example.my.package.name"
使用您的应用程序包名称。
public void showList() {
View popupView = getLayoutInflater().inflate(R.layout.some_popup_view, null);
PopupWindow popupWindow = new PopupWindow(popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
LinearLayout llPopup = (LinearLayout) popupView.findViewById(R.id.llPopup);
PackageManager pm = getPackageManager();
Intent intent = new Intent();
// In my case, NfcAdapter.ACTION_NDEF_DISCOVERED was not returning anything
//intent.setAction(NfcAdapter.ACTION_NDEF_DISCOVERED);
intent.setAction(NfcAdapter.ACTION_TECH_DISCOVERED);
List<ResolveInfo> resolvedInfoList = pm.queryIntentActivities(intent, 0);
String packageName = "";
for(ResolveInfo resInfo : resolvedInfoList) {
packageName = resInfo.activityInfo.applicationInfo.packageName;
// Exclude `packageName` from the dialog/popup that you show
if (!packageName.equals("com.example.my.package.name")) {
TextView tv = new TextView(this);
tv.setText(packageName);
llPopup.addView(tv);
}
}
popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);
}
关于java - 如何将 Android Intent 传递给除我自己的应用程序以外的任何人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17865647/