java - 如何将 Android Intent 传递给除我自己的应用程序以外的任何人?

标签 java android android-intent nfc

我有一个特定的 Intent (NDEF_DISCOVERED),其中一些我无法正确处理,所以我想将它们重定向到 android 的默认 nfc 处理程序。

所以我接受了 Intent ,setComponent(null),然后是startActivity(intent)

但是..它总是在 Intent 抛出的无限循环中返回到我的应用程序。

有没有一种方法可以将 Intent 发送给除我的应用之外的任何人?或者将它发送到 android 的默认 nfc 处理程序?

编辑: 所以我使用 vikram 的回答来查询 packagemanager 可能的 Activity 来处理我的 Intent ,然后循环并找到具有最高优先级的 Activity (不是我)并向他们发送明确的 Intent 。

最佳答案

在这种情况下,自定义选择器对话框/弹出窗口更适合您。不要启动 Intent ,而是使用 PackageManagerqueryIntentActivities(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/

相关文章:

android - 启动日历 Intent 后,如何使用应用程序 "go ahead"?安卓

android - 如何在 Nexus 7 上触发 MediaScan?

android - 通过 Intent 更改默认辅助应用程序

java - 使用 xtext 和 maven 解决构建问题

java - Intellij 使用 Maven 输出目录

android - 使用 ValueAnimator 对 LinearLayout 容器的高度进行动画处理

Android导航组件: No NavHostFragments found error

java - 如何使用 spring-integration 创建异步单例套接字服务器?

java - bean 验证不适用于 kotlin (JSR 380)

android - findFragmentById 总是返回 null