Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何检查应用程序是否可移动到sd_Android_Sd Card_Movable - Fatal编程技术网

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

Android 如何检查应用程序是否可移动到sd,android,sd-card,movable,Android,Sd Card,Movable,我想知道如何通过代码检查应用程序是否可以移动到sd。我知道如何获取已安装的应用程序列表,它是否在sd卡上。 如果ApplicationInfo标志包含ApplicationInfo.FLAG\u外部存储,则它位于sd卡上,但如何检查应用程序是否可移动到sd。我的第一个猜测是,查看Android源代码的活动太多了。此活动显示“移动到手机”和“移动到SD卡”按钮。它有一个有趣的功能,叫做: 尽管并非所有用于此函数的类都可以通过公共API获得。具体来说,PackageHelper是内部类。您可以按用户

我想知道如何通过代码检查应用程序是否可以移动到sd。我知道如何获取已安装的应用程序列表,它是否在sd卡上。

如果ApplicationInfo标志包含ApplicationInfo.FLAG\u外部存储,则它位于sd卡上,但如何检查应用程序是否可移动到sd。

我的第一个猜测是,查看Android源代码的活动太多了。此活动显示“移动到手机”和“移动到SD卡”按钮。它有一个有趣的功能,叫做:


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

您可以按用户获取所有应用程序筛选器,并尝试使用packetInfo设置筛选器“仅安装\u位置\u内部”

    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;
    }
}
List packagesAll=pm.getinstalledApplication(PackageManager.GET_META_DATA);
List packagesByUser=Stream.of(packagesAll)
.filter((p->(p.flags和ApplicationInfo.FLAG_SYSTEM)==0))
.filter((this::trymovedpackage))
.map(ApplicationInfo::新建)
.collect(Collectors.toList());
专用布尔值trymovedpackage(ApplicationInfo ApplicationInfo){
试一试{
PackageInfo PackageInfo=getPackageManager().getPackageInfo(applicationInfo.packageName,0);
if(packageInfo.installLocation==packageInfo.INSTALL\u LOCATION\u AUTO){
//Log.i(标记“安装位置自动”);
返回true;
}else if(packageInfo.installLocation==packageInfo.INSTALL\u LOCATION\u Preference\u EXTERNAL){
//Log.d(标记“安装位置”和“首选外部”);
返回true;
}否则{
//Log.w(标签“仅安装位置和内部”);
返回false;
}
}捕获(PackageManager.NameNotFounde异常){
e、 printStackTrace();
返回false;
}
}

pkgInfo.installLocation不可解析,即我无法访问installLocation值。你能帮我吗?你可以使用反射。这个成员在那里,只是不公开可见。你能再解释一下我如何使用反射吗。事实上,我对反思一无所知。为什么这个链接是为了。。。。
    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;
    }
}