java - 无法从 Android Leanback 应用程序中的 VideoDetailsFragment 访问 getPackageManager GetActivityInfo

标签 java android android-fragments android-package-managers

我想为 Android TV 制作一个应用程序,所以我使用 Android Studio 中默认的 Android TV Activity 作为我的项目模板,我想在 VideoDetailsFragment 中添加一个按钮,该按钮仅出现在包管理器之后检测到辅助 Activity 处于 Activity 状态。

如果包管理器检测到我的辅助 Activity 处于 Activity 状态并且正在运行,它应该显示一个按钮来禁用它,如果该 Activity 被禁用,它应该显示一个按钮来启用它,但是...包管理器无法获取 Activity 的名称,它实际上无法获取任何包或 Activity 的名称,它总是显示 NameNotFoundException 我的两个 Activity 都是 android:name="android.intent.action.MAIN “ 在 list 中,因为我想从启动器添加两者的启动 Intent ,但辅助 Activity 具有标签 android:enabled="false" 因为我想放置按钮VideoDetailsFragment 中的内容应该启用和禁用该 Activity 。

这是我的 list :

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

<uses-feature
    android:name="android.hardware.touchscreen"
    android:required="false" />
<uses-feature
    android:name="android.software.leanback"
    android:required="true" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/Theme.Leanback">
    <activity
        android:name=".MainActivity"
        android:banner="@mipmap/banner"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:logo="@mipmap/banner"
        android:screenOrientation="landscape">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".DetailsActivity" />
    <activity android:name=".PlaybackOverlayActivity" />
    <activity android:name=".BrowseErrorActivity" />
    <activity android:name=".SecondaryActivity"
        android:icon="@mipmap/ic_launcher"
        android:banner="@mipmap/banner"
        android:label="@string/app_name"
        android:screenOrientation="landscape"
        android:enabled="false">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
        </intent-filter>
    </activity>
</application>

这是VideoDetailsFragment代码:

private void setupDetailsOverviewRow() {
    Log.d(TAG, "doInBackground: " + mSelectedMovie.toString());
    final DetailsOverviewRow row = new DetailsOverviewRow(mSelectedMovie);
    row.setImageDrawable(getResources().getDrawable(R.drawable.default_background));
    int width = Utils.convertDpToPixel(getActivity()
            .getApplicationContext(), DETAIL_THUMB_WIDTH);
    int height = Utils.convertDpToPixel(getActivity()
            .getApplicationContext(), DETAIL_THUMB_HEIGHT);
    Glide.with(getActivity())
            .load(mSelectedMovie.getCardImageUrl())
            .centerCrop()
            .error(R.drawable.default_background)
            .into(new SimpleTarget<GlideDrawable>(width, height) {
                @Override
                public void onResourceReady(GlideDrawable resource,
                                            GlideAnimation<? super GlideDrawable>
                                                    glideAnimation) {
                    Log.d(TAG, "details overview card image url ready: " + resource);
                    row.setImageDrawable(resource);
                    mAdapter.notifyArrayItemRangeChanged(0, mAdapter.size());
                }
            });
    /******************************/
    /*HERE IS THE PROBLEMATIC CODE*/
    /******************************/
    PackageManager pm = getActivity().getPackageManager();
    ComponentName cn = new ComponentName(getActivity(), "com.valecast.myapp.SecondaryActivity");
    ActivityInfo info = pm.getActivityInfo(cn, 0); //<===IT NEVER LOCATE THIS
    if (info != null && info.enabled) {
        // Component is enabled
        row.addAction(new Action(ACTION_BUY, "it works"));
    } else {
        // Component is disabled
        row.addAction(new Action(ACTION_BUY, "it doesn't"));
    }
    /******************************/
    row.addAction(new Action(ACTION_WATCH_TRAILER, getResources().getString(
            R.string.watch_trailer_1), getResources().getString(R.string.watch_trailer_2)));
    row.addAction(new Action(ACTION_RENT, getResources().getString(R.string.rent_1),
            getResources().getString(R.string.rent_2)));
    row.addAction(new Action(ACTION_BUY, getResources().getString(R.string.buy_1),
            getResources().getString(R.string.buy_2)));

    mAdapter.add(row);
}

这是 android studio 中错误显示的屏幕截图:

Screenshot

这是另一个屏幕截图,显示了建议的答案之一,但它也不起作用:

enter image description here

我将其包装到 try catch 中,但是当我运行我的应用程序时,它总是在 Android 监视器中抛出 NameNotFoundException

我做错了什么?

最佳答案

您需要定义正确的组件名称:

new ComponentName("com.valecast.myapp", "com.valecast.myapp.SecondaryActivity");

并尝试一下:

try {
    ActivityInfo info = pm.getActivityInfo(cn, 0);
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

关于java - 无法从 Android Leanback 应用程序中的 VideoDetailsFragment 访问 getPackageManager GetActivityInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40990974/

相关文章:

java - 接受数组列表中的字符串并返回每个字母表

java - Intent 另一个布局的运行时错误

android - fragment 中的 runOnUiThread() 方法

android - fragment 最佳实践

android - 什么时候应该调用 Fragment 的 onActivityCreated?

java - 如何在 Activity 开始时显示数字键盘?

java - 如何从Eclipse运行Javac

java - 将 ImageView 靠近 TextView

android - 不能在 Dialog 类中使用 getAsset()

android - FragmentTabHost 图形布局不呈现