android第三方应用安装来源设置分析
2014-12-19 10:44
127 查看
1.在系统设置里面->应用程序设置->未知来源设置
下面是界面元素定义
\packages\apps\Settings\res\xml\application_settings.xml
<CheckBoxPreference
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
<activity android:name=".PackageInstallerActivity"
android:configChanges="orientation|keyboardHidden"
android:theme="@style/TallTitleBarTheme">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" />
<data android:scheme="file" />
<data android:mimeType="application/vnd.android.package-archive" />
</intent-filter>
</activity>
<activity android:name=".UninstallerActivity"
android:configChanges="orientation|keyboardHidden"
android:theme="@style/TallTitleBarTheme">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.DELETE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="package" />
</intent-filter>
</activity>
安装一个程序:
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);
}
下面是界面元素定义
\packages\apps\Settings\res\xml\application_settings.xml
<CheckBoxPreference
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
<activity android:name=".PackageInstallerActivity"
android:configChanges="orientation|keyboardHidden"
android:theme="@style/TallTitleBarTheme">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" />
<data android:scheme="file" />
<data android:mimeType="application/vnd.android.package-archive" />
</intent-filter>
</activity>
<activity android:name=".UninstallerActivity"
android:configChanges="orientation|keyboardHidden"
android:theme="@style/TallTitleBarTheme">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.DELETE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="package" />
</intent-filter>
</activity>
安装一个程序:
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);
}
相关文章推荐
- android第三方应用安装来源设置分析
- 安装macOS Sierra后,会发现系统偏好设置的“安全与隐私”中默认已经去除了允许“任何来源”App的选项,无法运行一些第三方应用。
- Android系统设置settings应用学习(一)--允许未知来源应用安装
- 在android模拟机上快速安装第三方应用的方法
- android通过配置文件设置应用安装到SD卡上的方法
- android获取应用信息,判断应用来源,监听应用的安装和卸载
- Android--应用安装卸载失败问题分析
- Android如何将第三方预装的AP安装在data/app下面,用户可以选择卸载,但是在用户恢复出厂设置后,会再次自动安装
- Android初学------系统设置之获取所有安装应用大小
- Android开发,在一个项目中调用(启用)已经安装的第三方apk应用软件
- Android分析第三方应用layout的神器
- Android菜鸟开发之蓝牙(Bluetooth)---设置应用源码分析
- Android分析第三方应用layout的神器
- android 返回本机安装的所有第三方应用
- android 应用的安装与管理分析一
- android应用安装路径默认设置
- android获取所有应用信息,判断系统应用或第三方应用,监听应用安装和卸载
- 解决:在用户安装”未知来源“应用弹出对话框直接解除禁止,无需切换至设置页面进行勾选“未知来源“才能安装
- Android应用安装原理--Android是如何认定应用为未知来源