未找到 Activity 来处理 Intent(API 级别 19)

No Activity found to handle Intent (API Level 19)

在我的一生中,我已经与这种隐含的意图作斗争超过 2 天了。我正在尝试使用 startActivity(intent) 隐式启动 Activity,但我一直收到 "No activity found to handle intent",我已按照 android 开发人员网站上的说明进行操作创建和处理隐式意图并搜索了网络,包括很多关于 Whosebug 的帖子,但问题仍然存在。现在是时候写一些代码了:

组件 A - 触发隐式意图

Intent intent = new Intent();
//intent.setFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES);
intent.setAction(AppConstants.ACTION_VIEW_OUTLET);
//intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.withAppendedPath(OutletsContentProvider.CONTENT_URI,String.valueOf(outletID)));
intent.addCategory(Intent.CATEGORY_DEFAULT); 

    PackageManager pm = getPackageManager();
    ComponentName cn = intent.resolveActivity(pm);

    if(cn != null){
        startActivity(intent);
        Log.i(TAG, "Intent sent with action :" + intent.getAction());
        Log.i(TAG, "Intent sent with data :" + intent.getDataString());
    }

Android 清单(在与组件 A 相同的应用程序中)

    <activity
        android:name=".OutletDetailsActivity"
        android:label="@string/title_activity_outlet_details">
        <intent-filter>
            <data android:scheme="content" />
            <action android:name="com.synkron.pushforshawarma.ACTION_VIEW_OUTLET" />

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

我做错了什么?我使用广播意图取得了巨大的成功,但在这种情况下我不想使用 broadcast/receiver。

所以我终于想通了。

碰巧的是,当数据(URI,通过 setData 或通过使用接受 URI 的构造函数)设置在意图上时,系统会确定意图所需的适当 MIME 类型。

    Intent intent = new Intent(AppConstants.ACTION_VIEW_OUTLET);
    intent.putExtra("OUTLET_ID", 
        Uri.withAppendedPath(OutletsContentProvider.CONTENT_URI, String.valueOf(outletID)));
    intent.addCategory(Intent.CATEGORY_DEFAULT); 

当未设置或指定 URI 或数据时,需要使用 settype() 来指定与意图关联的数据类型 (MIME)。

所以基本上,我在初始化意图时没有设置 MIME 类型(我需要设置数据 (URI),因为我设置了数据 (URI))。由于数据类型测试失败,意图过滤器无法匹配隐式意图。

我的变通方法是通过 putExtra 方法传递我的 URI,但未设置数据。

我还从 android 清单中删除了对 intent 过滤器中数据标记的引用。

    <activity
        android:name=".OutletDetailsActivity"
        android:label="@string/title_activity_outlet_details">
        <intent-filter>
            <action android:name="com.synkron.pushforshawarma.ACTION_VIEW_OUTLET" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>