<data android:scheme="file" />,Android第三方应用安装来源设置分析

本文分析了Android系统中设置第三方应用安装来源的过程,包括在系统设置中的界面元素定义、安装时的检查逻辑以及如何避免安装提示对话框。讨论了PackageInstaller组件在安装过程中的作用,并提供了安装和卸载应用的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在系统设置里面->应用程序设置->未知来源设置下面是界面元素定义

\packages\apps\Settings\res\xml\application_settings.xml

Android:key="toggle_install_applications"

android:title="@string/install_applications"

android:summaryOff="@string/install_unknown_applications"

android:summaryOn="@string/install_unknown_applications"

android:persistent="false" />

下面是界面设置变动修改的settings信息。1是允许 0是不允许

// Change the system setting

Settings.Secure.putInt(getContentResolver(), Settings.Secure.INSTALL_NON_MARKET_APPS,

enabled ? 1 : 0);

只是修改了Settings.Secure.INSTALL_NON_MARKET_APPS这个设置变量并没有做其它的事情;

2.在系统安装apk时会调用系统里面的一个叫PackageInstaller.apk

packages\apps\PackageInstaller\src\com\android\packageinstaller\PackageInstallerActivity.java

1)安装apk时会调用这个系统的apk执行安装过程,在创建这个安装的activity时onCreate()会去check未知来源设置

//check setting

if(!isInstallingUnknownAppsAllowed()) {

//ask user to enable setting first

showDialogInner(DLG_UNKNOWN_APPS);

return;

}

如果你设置了不允许安装,会弹出禁止安装的Dialog,点击设置会把你引导到系统设置->应用程序设置里面。

有个问题是,只要设置为不允许,调用PackageInstaller.apk安装都会弹出,不知道如何做到可以不弹出?现在开发的版本大多都是定制的。找遍几个手机,都没有发现,googleappstore安装不需要设置的。个人认为如果要修改,可能就会在这里面做文章,而不是修改PackageManagerService.

2)调用初始化安装,再调 startInstallConfirm->InstallAppProgress.java启动安装进度

// Start subactivity to actually install the application

Intent newIntent = new Intent();

newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO,

mPkgInfo.applicationInfo);

newIntent.setData(mPackageURI);

newIntent.setClass(this, InstallAppProgress.class);

String installerPackageName = getIntent().getStringExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME);

if (installerPackageName != null) {

newIntent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, installerPackageName);

}

if(localLOGV) Log.i(TAG, "downloaded app uri="+mPackageURI);

startActivity(newIntent);

调用AndroidManifest.xml安装和卸载

在AndroidManifest.xml的源码中我们知道:

packages\apps\PackageInstaller\AndroidManifest.xml

android:configChanges="orientation|keyboardHidden"

android:theme="@style/TallTitleBarTheme">

android:configChanges="orientation|keyboardHidden"

android:theme="@style/TallTitleBarTheme">

安装一个程序:

String fileName = Environment.getExternalStorageDirectory() + "/myApp.apk";

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setDataAndType(Uri.parse("file://" + filePath),"application/vnd.android.package-archive");

//或者

//intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");

startActivity(intent);

卸载一个程序:

Uri packageURI = Uri.parse("package:com.android.myapp");

Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);

startActivity(uninstallIntent);

程序的安装请注意:默认是不支持安装非市场程序的 因此判断一下

int result = Settings.Secure.getInt(getContentResolver(), Settings.Secure.INSTALL_NON_MARKET_APPS, 0);

if (result == 0) {

// show some dialog here

// ...

// and may be show application settings dialog manually

Intent intent = new Intent();

intent.setAction(Settings.ACTION_APPLICATION_SETTINGS);

startActivity(intent);

}0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值