【问题标题】:android.content.pm.PackageManager$NameNotFoundException: when using 2 product flavors?android.content.pm.PackageManager$NameNotFoundException:使用 2 种产品风味时?
【发布时间】:2016-07-29 00:24:02
【问题描述】:

我有 2 种产品风味。让我们说这样的例子:

productFlavors {
    free {
      applicationId 'com.free.android'

    }
    premium {
      applicationId 'com.premium.android'

    }

我的问题是当我使用时

Intent resultIntent = new Intent(this, ExpiryListActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ExpiryListActivity.class);
stackBuilder.addNextIntent(resultIntent);

问题发生在stackBuilder.addParentStack(ExpiryListActivity.class) 第一个免费使用 productFlavor 的应用程序不会导致 android.content.pm.PackageManager$NameNotFoundException 错误。 但是第二个使用 productFlavor 溢价的应用程序会导致android.content.pm.PackageManager$NameNotFoundException。 然后我阅读了 stackBuilder.addParentStack(<Class>) 添加由 manifest 指定的活动父链的文档。如何解决这个问题?

【问题讨论】:

    标签: java android


    【解决方案1】:

    TL;DR 将您的元数据更改为

    <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="originalPackageName.ui.MainActivity" />
    

    基本问题是 gradle 正在扩展您在元数据中编写的父活动类的包名。

    如果是您的免费产品风味,它会尝试在 com.free.android.ui.MainActivity

    位置找到一个类

    如果您付费,它会尝试在 com.premium.android.ui.MainActivity

    位置查找课程

    但是当你为你的产品风格提到不同的 applicationId 并且类仍然位于 originalPackageName.ui.MainActivity 并且因此 NameNotFoundException

    时,gradle 实际上并没有重组包

    其中 originalPackageName 是您开始项目时使用的包名称的占位符。

    【讨论】:

    • 嗨@Aashrai Ravoouro。感谢您的回答。一开始,我也是这么想的。但是,我不能有两个清单。
    • 嗯,那么使用manifest placeholders怎么样
    • 抱歉回复晚了@Aashrai Ravooru 我从来没有用过那些。但感谢您的参考。正在寻找它!
    【解决方案2】:

    看起来我找到了。在 AndroidManifest.xml 上

    <activity
                android:name=".ui.ExpiryListActivity"
                android:label="@string/voucher_expiry_list"
                android:screenOrientation="portrait"
                android:theme="@style/AppTheme.NoActionBar.Slidable" >
              <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.MainActivity" />
            </activity>
    

    我将元数据名称替换为:

    <activity
                android:name=".ui.ExpiryListActivity"
                android:label="@string/voucher_expiry_list"
                android:screenOrientation="portrait"
                android:theme="@style/AppTheme.NoActionBar.Slidable" >
              <meta-data
                android:name=".ui.ExpiryListActivity"
                android:value=".ui.MainActivity" />
            </activity>
    

    它可以工作,但是当按下它时它无法返回到 MainActivity。但是,我知道这是否不是最好的解决方案。如果有其他更好的解决方案,请告诉我。 注意:这似乎只发生在 Android Lollipop (5.0) 上

    【讨论】:

      猜你喜欢
      • 2021-02-25
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多