アプリがコードでsdに移動できるかどうかを確認する方法を知りたいです。インストールされているアプリケーションのリストを取得する方法を知っています。SDカードにあるかどうかはわかりません。
ApplicationInfoフラグにApplicationInfo.FLAG_EXTERNAL_STORAGEが含まれている場合、それはsdカードにありますが、アプリがsdに移動可能かどうかを確認するにはどうすればよいですか。
2355 次
2 に答える
2
私の最初の推測は、Android のソース コードを調査してInstalledAppDetails
アクティビティを確認することです。「スマホに移動」「SDカードに移動」ボタンを表示するアクティビティです。と呼ばれる興味深い機能がありますinitMoveButton
:
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 を介して利用できるわけではありません。具体的PackageHelper
には内部クラスです。
于 2011-05-26T16:40:01.060 に答える