android - 如何检查应用程序是否可移动到 sd

标签 android sd-card movable

我想知道如何通过代码检查应用程序是否可以移动到sd。我知道如何获取已安装的应用程序列表,它是否在 sd 卡上。
如果 ApplicationInfo 标志包含 ApplicationInfo.FLAG_EXTERNAL_STORAGE 那么它在 sd 卡上,但我如何检查该应用程序是否可以移动到 sd。

最佳答案

我的第一个猜测是查看 InstalledAppDetails 的 Android 源代码。 Activity 。这是显示“移动到手机”和“移动到 SD 卡”按钮的 Activity 。它有一个有趣的函数叫做 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);
    }
}

尽管并非此函数中使用的所有类都可以通过公共(public) API 获得。具体来说,PackageHelper 是内部类。

关于android - 如何检查应用程序是否可移动到 sd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6141592/

相关文章:

android - 如何获得连续的触摸事件?

android 列出 sd 卡上的音频并播放

android - 设计仅包含图标的支持库选项卡

安卓报警类

java - 是否需要添加一些东西来避免在 Activity 之间切换时发生内存泄漏?

cocoa - 我可以使用窗口内的对象来移动窗口吗?

cordova - PhoneGap/Cordova BlackBerry FileSystem.root 总是返回 SD 卡?

android - 为什么我的 SD 卡不可写 (Android)?

c# - 使无边框形式可移动?