如何解决我如何检查该应用是否可以移动到sd
|| 我想知道如何通过代码检查应用程序是否可移动到sd。我知道如何获取已安装的应用程序列表,它是否在SD卡上。 如果ApplicationInfo标志包含ApplicationInfo.FLAG_EXTERNAL_STORAGE,则它在sd卡上,但是如何检查该应用程序是否可移动到sd。解决方法
我的第一个猜测也是针对
InstalledAppDetails
活动的Android源代码。此活动显示“移至手机”和“移至SD卡”按钮。它具有称为ѭ1called的有趣功能:
private void initMoveButton() {
String pkgName = mAppInfo.packageName;
boolean dataOnly = false;
ApplicationInfo info1 = null;
PackageInfo pkgInfo = null;
try {
info1 = mPm.getApplicationInfo(pkgName,0);
pkgInfo = mPm.getPackageInfo(mAppInfo.packageName,PackageManager.GET_UNINSTALLED_PACKAGES);
} catch (NameNotFoundException e) {
}
dataOnly = (info1 == null) && (mAppInfo != null);
boolean moveDisable = true;
if (dataOnly) {
mMoveAppButton.setText(R.string.move_app);
} else if ((mAppInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
mMoveAppButton.setText(R.string.move_app_to_internal);
// Always let apps move to internal storage from sdcard.
moveDisable = false;
} else {
mMoveAppButton.setText(R.string.move_app_to_sdcard);
if ((mAppInfo.flags & ApplicationInfo.FLAG_FORWARD_LOCK) == 0 &&
(mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0 &&
pkgInfo != null) {
if (pkgInfo.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL ||
pkgInfo.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
moveDisable = false;
} else if (pkgInfo.installLocation == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) {
IPackageManager ipm = IPackageManager.Stub.asInterface(
ServiceManager.getService(\"package\"));
int loc;
try {
loc = ipm.getInstallLocation();
} catch (RemoteException e) {
Log.e(TAG,\"Is Pakage Manager running?\");
return;
}
if (loc == PackageHelper.APP_INSTALL_EXTERNAL) {
// For apps with no preference and the default value set
// to install on sdcard.
moveDisable = false;
}
}
}
}
if (moveDisable) {
mMoveAppButton.setEnabled(false);
} else {
mMoveAppButton.setOnClickListener(this);
mMoveAppButton.setEnabled(true);
}
}
尽管并非所有此函数中使用的类都可以通过公共API获得。具体来说,“ 3”是内部类。
,您可以按用户获取所有应用程序过滤器,然后尝试packetInfo设置过滤器\'INSTALL_LOCATION_INTERNAL_ONLY \'
List<ApplicationInfo> packagesAll = pm.getInstalledApplications(PackageManager.GET_META_DATA);
List<ApplicationInfo> packagesByUser = Stream.of(packagesAll)
.filter((p -> (p.flags & ApplicationInfo.FLAG_SYSTEM) == 0))
.filter((this::tryMoveSDPackage))
.map(ApplicationInfo::new)
.collect(Collectors.toList());
private boolean tryMoveSDPackage(ApplicationInfo applicationInfo) {
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(applicationInfo.packageName,0);
if (packageInfo.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
//Log.i(TAG,\"INSTALL_LOCATION_AUTO\");
return true;
} else if (packageInfo.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL) {
//Log.d(TAG,\"INSTALL_LOCATION_PREFER_EXTERNAL\");
return true;
} else {
//Log.w(TAG,\"INSTALL_LOCATION_INTERNAL_ONLY\");
return false;
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return false;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。