是否可以在运行时以编程方式更新 Android Manifest?

问题描述 投票:0回答:2

我想要实现的目标:

我正在创建一个以编程方式更改应用程序图标和应用程序名称的应用程序。

我所取得的成就:

我已经实现了这一点,因为通过在 android 清单中声明活动别名,只有 5 个名称和图标。

我面临的问题:

如果您只有 5 个名称,那么很容易在清单中声明它。但如果你不知道号码怎么办?名称,您必须以编程方式更新清单。

下面是我的代码:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.drawerstack">

    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <activity-alias android:label="@string/app_name1"
            android:icon="@drawable/ic_launcher"
            android:name=".MainActivity-Red"
            android:enabled="false"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

        <activity-alias android:label="@string/app_name2"
            android:icon="@drawable/ic_launcher_1"
            android:name=".MainActivity-Pink"
            android:enabled="false"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

        <activity-alias android:label="@string/app_name3"
            android:icon="@drawable/ic_launcher_2"
            android:name=".MainActivity-Blue"
            android:enabled="false"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

        <activity-alias android:label="@string/app_name4"
            android:icon="@drawable/ic_launcher_3"
            android:name=".MainActivity-Grey"
            android:enabled="false"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>
    </application>
</manifest>

MainActivity.java

    img.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (view.getTag().equals(0)) {
                changeIcon("com.drawerstack.MainActivity-Red");
                removeIcon("com.drawerstack.MainActivity");
                removeIcon("com.drawerstack.MainActivity-Pink");
                removeIcon("com.drawerstack.MainActivity-Blue");
                removeIcon("com.drawerstack.MainActivity-Grey");
            } else if (view.getTag().equals(1)) {
                changeIcon("com.drawerstack.MainActivity-Pink");
                removeIcon("com.drawerstack.MainActivity-Blue");
                removeIcon("com.drawerstack.MainActivity-Grey");
                removeIcon("com.drawerstack.MainActivity-Red");
                removeIcon("com.drawerstack.MainActivity");
            } else if (view.getTag().equals(2)) {
                changeIcon("com.drawerstack.MainActivity-Blue");
                removeIcon("com.drawerstack.MainActivity-Pink");
                removeIcon("com.drawerstack.MainActivity-Grey");
                removeIcon("com.drawerstack.MainActivity-Red");
                removeIcon("com.drawerstack.MainActivity");
            } else if (view.getTag().equals(3)) {
                changeIcon("com.drawerstack.MainActivity-Grey");
                removeIcon("com.drawerstack.MainActivity-Pink");
                removeIcon("com.drawerstack.MainActivity-Red");
                removeIcon("com.drawerstack.MainActivity-Blue");
                removeIcon("com.drawerstack.MainActivity");
            }
        }
    });


private void changeIcon(final String pkgName) {

    doAsynchronousTask = new TimerTask() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            Date now = new Date();
            if(now.after(afterDate)){
                timer.cancel();
                Common.dismissProgressDialog(MainActivity.this);
                finish();
            }
        }
    };
    timer.schedule(doAsynchronousTask, 0, 50000);

    Common.loadProgressDialog(MainActivity.this,false);
    getPackageManager().setComponentEnabledSetting(
            new ComponentName("com.drawerstack", pkgName),
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}


private void removeIcon(String removePkg) {
        getPackageManager().setComponentEnabledSetting(
                new ComponentName("com.drawerstack", removePkg),
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}
android android-manifest
2个回答
13
投票

假设您的问题是标题中的问题:

是否可以通过编程方式更新 Android Manifest?

答案是,不可能以编程方式做到这一点。

您可以启用/禁用清单中声明的组件,但无法从其中添加或删除某些内容,因为顾名思义,它是一个清单文件,系统在安装您的应用程序时“读取”该文件。因此,您在该清单中声明了应用程序的界面,稍后您无法更改它,除非您使用另一个清单重新安装应用程序。

假设系统为您提供了这样做的能力。然后,您可以动态地向您的清单添加一些权限,而用户在从 Play 商店下载您的应用程序时尚未批准该权限。


0
投票

我希望有任何方法可以在运行时以编程方式更改清单数据。 例如:我想在运行时更改Admob或任何其他网络ID或Applovin SDK ID: ca-app-pub-8262481943822764~6281441582

为此,必须有一种方法可以通过编程来更改它。

© www.soinside.com 2019 - 2024. All rights reserved.