android - 如何正确安装 APK 文件,以便启动器在主屏幕上创建一个新的应用程序图标?

标签 android apk android-launcher packageinstaller

背景

我有一个业余时间制作的应用程序 ( here ),它的主要功能之一是安装 APK 文件。

问题

安装应用的用户希望启动器上会出现一个新的应用图标。

这可能发生在 Play 商店,但出于某种原因,启动器会忽略其他类型的安装。

Play 商店安装应用的方式与第三方应用的安装方式有所不同。

我想知道如何正确地执行此操作,例如在 Play 商店中,以便安装 APK 文件时也会创建一个应用程序图标。

我尝试过的

我发现安装 APK 的唯一方法是这样的:

@Nullable
public static Intent prepareAppInstallationIntent(Context context, File file, final boolean requestResult) {
    Intent intent = null;
    try {
        intent = new Intent(Intent.ACTION_INSTALL_PACKAGE)//
                .setDataAndType(
                        VERSION.SDK_INT >= VERSION_CODES.N ?
                                android.support.v4.content.FileProvider.getUriForFile(context, context.getPackageName() + ".provider", file)
                                : Uri.fromFile(file),
                        "application/vnd.android.package-archive")
                .putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true)
                .putExtra(Intent.EXTRA_RETURN_RESULT, requestResult)
                .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        if (VERSION.SDK_INT < VERSION_CODES.JELLY_BEAN)
            intent.putExtra(Intent.EXTRA_ALLOW_REPLACE, true);
    } catch (Throwable e) {
    }
    return intent;
}

list

<provider
  android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true">
  <meta-data
    android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>
</provider>

xml/provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
  <!--<external-path name="external_files" path="."/>-->
  <external-path
    name="files_root" path="Android/data/${applicationId}"/>
  <external-path
    name="external_storage_root" path="."/>
</paths>

但这不会在启动器上创建应用程序图标。

在问题跟踪器 ( here ) 上写下这个,我得到了我应该做什么的线索。我被告知:

Icons are added to the home screen if the app is installed via the new PackageInstaller APIs (and proper install reason is provided). Installing an app for command like does not support this feature.

问题

  1. 是否有第三方应用程序的 API 可以正确安装应用程序,并在启动器上为其添加新图标?如果是这样,具体如何?

  2. 有没有办法甚至使用 root 来做到这一点?并通过 PC 使用 adb 命令?

最佳答案

这是使用 Intent 完成的方式(需要知道应用程序的包名称):

fun prepareAppInstallationIntent(context: Context, file: File, requestResult: Boolean, packageName: String? = null): Intent? {
    var intent: Intent? = null
    try {
        intent = Intent(Intent.ACTION_INSTALL_PACKAGE) //
            .setDataAndType(
                if (VERSION.SDK_INT >= VERSION_CODES.N)
                    androidx.core.content.FileProvider.getUriForFile(
                        context,
                        context.packageName,
                        file
                    )
                else
                    Uri.fromFile(file),
                "application/vnd.android.package-archive"
            )
            .putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true)
            .putExtra(Intent.EXTRA_RETURN_RESULT, requestResult)
            .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        if (packageName != null && VERSION.SDK_INT >= VERSION_CODES.N) {
            intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName)
        }
        intent.putExtra(Intent.EXTRA_ALLOW_REPLACE, true)
    } catch (e: Throwable) {
    }
    return intent
}

关于android - 如何正确安装 APK 文件,以便启动器在主屏幕上创建一个新的应用程序图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50873201/

相关文章:

android - 如何以编程方式设置默认启动器应用程序?

android - 继续查询时间直到匹配给定时间

android - 无法解析 org.jetbrains.kotlin :kotlin-gradle-plugin:1. 4.10

Android studio - 发布 APK for flavor

android - 为什么我的应用在设备上的大小与 APK 或 Play 商店的大小不同

android - 如何从我的 Activity 中明确启动库存启动器?

安卓 USB 设备 : how to determine "vendor name" and "device name" from vendorID and DeviceID?

java - sendUserActionEvent() 返回

java - 如何打开 .apk 文件

android - 从 Play 商店更新手动安装的应用程序