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

2023-12-14

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


我的第一个猜测是太研究 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是内部类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查应用程序是否可移动到 SD 的相关文章

  • 如何为 Android 创建我们自己的 PDF 查看器?

    我想构建一个可在我的 Android 应用程序中使用的 PDF 阅读器 查看器 但我无法使用 Google 文档来阅读我的内容 我无法使用我的设备中已安装的任何 PDF 阅读器 它应该位于我的应用程序内 并且不会通过互联网公开我的安全内容
  • 在 Android 模拟器上运行完整的 Android 手机 ROM

    正如标题所说 是否可以在 Android 模拟器中运行完整的 Android 设备 ROM 是的 你可以 但让它 100 工作可能很困难 大多数 ROM 都包含其运行硬件的特定驱动程序 我并不是 100 全力以赴 但可以尝试以下步骤 创建
  • 在 ubuntu 中找不到 .android 文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在哪里可以找到 android在 Ubuntu 中 我想使用debug keystore 转到您的主文件夹并按 ctrl h 瞧
  • 由于现有相机用户,相机“0”的手电筒不可用

    我想创建一个应用程序 它有一个用于录制视频的按钮和另一个单独的切换按钮 用于在录制视频期间打开闪光灯 我已经使用camera2 API为最近的androids构建了相机应用程序 可以通过图像按钮访问 我将火炬模式设置为切换按钮 但这根本不起
  • Android 位置 API:获取提供商状态

    在 Android 中获取位置提供商状态的最佳方式是什么 当注册 LocationListener 以进行位置更新时 onStatusChanged String provider int status Bundle extras 每当状态
  • Android:将声音保存为铃声/SQLiteConstraintException

    我正在尝试使用 Android 将声音保存为铃声this http www stealthcopter com blog 2010 01 android saving a sound file to sd from resource and
  • java.lang.IllegalStateException:需要 .、< 或 ;,但在解压时发现 firebaseperf

    在我的应用程序中集成性能 SDK 后 gradle 在构建项目时打印以下警告 java lang IllegalStateException 需要 Ljava lang Object Lcom google android gms inte
  • 如果未安装应用程序,深层链接将重定向到 Play 商店

    我在我的应用程序中使用深度链接的概念 我真正想要的是 当我共享我的应用程序中的链接时 它工作正常 它会转到我想在我的应用程序中打开的活动 但问题是当用户没有这个时应用程序此链接通过手机浏览器打开 显示错误 未找到 但如果未安装应用程序 我想
  • 改造将多个图像上传到单个密钥

    我正在使用 Retrofit 将图像上传到我的服务器 这里我需要为一个密钥上传多个图像 我已经尝试使用 Postman 网络客户端 它运行良好 这是一个屏幕截图 以下是请求的键值对 调查图像 文件1 文件2 文件3 属性图像 文件DRA j
  • 返回到上一个活动的最后状态

    我有两个活动 A 和 B 当应用程序启动时 活动 A 会被加载 我会从数据库将数据加载到其中 我可以毫无问题地转到活动 B 但是当我返回活动 A 时 会查看旧数据一段时间 然后重新加载活动 知道如何解决这个问题吗 在从数据库加载数据之前清除
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • 作为 ViewPager 的一部分更新 ListFragment 中的数据

    我在 Android 中使用 v4 兼容性 ViewPager 我的 FragmentActivity 有一堆数据 这些数据将以不同的方式显示在我的 ViewPager 的不同页面上 到目前为止 我只有同一个 ListFragment 的
  • 如何告诉 OkHttpClient 忽略缓存并强制从服务器刷新?

    在我的 Android 应用程序中 我将 Retrofit 与 OkHttpClient 结合使用 并启用缓存来访问某些 API 我们的一些 API 有时会返回空数据 我们在应用程序中提供了一个 刷新 按钮 供客户端从特定 API 重新加载
  • 错误膨胀类 android.support.design.widget.NavigationView [启动时崩溃]

    该应用程序应该有一个导航抽屉 可以从左侧拉出并显示各种活动 但是一旦将导航栏添加到 XML Activity homescreen 文档中 应用程序一启动就会崩溃 主屏幕 java package com t99sdevelopment c
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • Android Lollipop 中应用程序外部配置文件和内部配置文件之间的数据传输

    相关问题安卓工作版 我的应用程序是一个设备管理员特权应用程序 现在我修改了创建托管工作配置文件并将其自身设置为配置文件所有者的代码 问题是 如果我upgrade我的应用程序 它成为设备管理员的配置文件所有者 现在将会有两份我的应用程序 一个
  • 线性布局高度和重量

    我有以下内容
  • 永久删除Android文件

    我发现了一个名为这会从 Android 设备中永久删除文件和文件夹 以便删除的文件无法再恢复 这是我正在谈论的应用程序 但我想知道如何做到这一点 我知道它是用 android studio 制作的 i尝试了常规的删除方式file delet
  • 从 Dropbox 下载文件并将其保存到 SDCARD

    现在我真的很沮丧 我想从 Dropbox 下载一个文件并将该文件保存到 SD 卡中 我得到的代码为 private boolean downloadDropboxFile String dbPath File localFile throw
  • 连接到具有相同 SSID 的最强接入点(信号最强的接入点)

    我正在编写一个程序来始终连接到最强的接入点 我的意思是信号最强的接入点 首先 我扫描所有可用的 WiFi 网络 然后限制它们仅查看具有相同 SSID 的网络 这样我就可以看到一个网络的所有AP 当我连接到该网络时 它没有连接到最强的信号 但

随机推荐

  • 如何使用 Express / Node.JS 创建可在所有视图中访问的全局变量?

    好的 所以我用它建立了一个博客Jekyll你可以在文件中定义变量 config yml可在所有模板 布局中访问 我目前正在使用Node JS Express with EJS模板和ejs 本地人 对于部分 布局 我希望做一些类似于全局变量的
  • ExpandableListView 中的子选择

    In an ExpandableListView是否可以最初选择一个子项 以便展开包含组并将列表滚动到该子项的位置 我想setSelectedChild可以解决问题 但不会给出任何结果 我用下面的代码进行了测试 public class M
  • 检查Python中的字符串是否可以转换为浮点型[重复]

    这个问题在这里已经有答案了 我有一些 Python 代码 可以运行字符串列表 并在可能的情况下将它们转换为整数或浮点数 对整数执行此操作非常简单 if element isdigit newelement int element 浮点数更难
  • 当内存有问题时如何修改大型 Excel 文件

    正如标题所述 我有一个很大的 Excel 文件 gt 200 张 需要向其中添加数据 我不想创建新的单元格 我只想修改现有的单元格 我尝试使用 Apache Poi 但即使 Xms 和 Xmx 设置为 8g 我的应用程序也会出现内存不足的情
  • Heroku/devise - 缺少要链接的主机!请提供 :host 参数或设置 default_url_options[:host]

    我正在尝试将我的应用程序推送到heroku 上 我还在开发中 我使用带有可确认模块的设备 当我尝试使用 heroku 控制台添加用户时 出现以下错误 Missing host to link to Please provide host p
  • 使用bundle将ArrayList从片段传递到另一个片段(扩展ListFragment),seListAdapter运行时错误

    我尝试过对 ArrayList 使用静态变量 但在 ListFragment 类中 在调试时它的值为 null 我认为 ListFragment 是在初始化 ArrayList 之前创建的 这就是它为 null 的原因 但不确定 建议我是否
  • 从广播接收器或服务启动 Android TTS

    我正在尝试让 TTS 在后台运行 但是 我从来没有听到任何声音 我有一个启动服务的广播接收器 我将我的 TTS 代码放入其中 但它从不说话 我知道该方法正在被调用 我在上面设置了断点 但它仍然不起作用 这是我的日志 但它似乎不包含有关 TT
  • 使用 Web 插件时,UFT 如何执行 Click 方法?

    我正在使用 UFT 11 50 在 Internet Explorer 8 0 上测试高度基于 javascript 的应用程序 我想知道使用 Web Add In 时 UFT 如何在后台实现 Click 方法 UFT 是否发送 Windo
  • 如何在 Angular $http 服务中确定请求的优先级?

    我正在开发一个具有大量延迟数据加载的应用程序 我想根据 优先级 参数对 http 请求进行优先级排序 这就是使用它的概念 http get url params query priority 1 我正在考虑使用 http 拦截器 像这样的东
  • Java 和 SQLite [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我被单个文件数据库提供的整洁所吸引 有哪些驱动程序 连接器库可以通过 Java 连接和使用 SQLite 我发现了一个包装库 http www ch werner de javasq
  • 结合 Jackson @JsonView 和 @JsonProperty

    有没有一种方法不仅可以通过在 JsonView 中使用不同的类来查看 隐藏字段 还可以根据分别用于每个字段的视图定义不同的名称 如 JsonProperty 问候并谢谢 蒂姆 我的解决方案包括杰克逊 米辛特征 我使用相同的视图类来放置不同的
  • 当 foo 由类 ArrayList 而不是接口 List 表示时,使用它不是更容易吗?

    我经常看到这种语法 但不明白其背后的推理 我认为您通常希望使用类而不是接口 以便更轻松地执行您可能想要执行的全部操作 为什么要这样做 List
  • 标签框中的换行符

    我怎样才能换行label box使用 C 这是我的代码 用于在标签框中显示数据库中的值 protected List
  • 将 ArrayList 参数传递给控制器​​操作 ASP.NET MVC

    我正在编写一个应用程序 其中我需要将 System Collections ArrayList 数据作为参数从一个控制器操作发送到另一个控制器操作 我在用 return RedirectToAction action1 controller
  • 我什么时候应该打电话给super?

    最好用什么 super any method name 最近我发现在 dealloc 中 super dealloc 必须站在同一立场上 因为如果我们在之后设置它 之前没有使用过的任何变量都可能被垃圾填充 super dealloc 这是一
  • 用于计算英国邮政编码之间距离的库

    我正在寻找一种方法来计算两个英国邮政编码之间的近似距离 直线距离足够好 以分析数据 最好可以通过 java 轻松访问 但 C 本机 C 等也可以 首先 您需要将邮政编码转换为有用的坐标 例如 邮政编码查找表中的东距和北距值 如下所示 htt
  • R 中一百万个观测值的 Kmeans - 绘制集群时遇到的问题

    我正在尝试对超过 100 万行执行 KMeans 聚类 其中有 4 个观察值 全部为数字 我正在使用以下代码 kmeansdf lt as data frame rbind train V3 train V5 train V8 train
  • 如何使用 AngularJS 在点击时对列进行反向排序

    我有一个简单的方法来对表列进行排序 但我无法找到一种方法来在单击和返回时反向排序之间进行交替 有人对这个问题有任何解决方案吗 下面是一个小提琴 向您展示我的意思 div div p orderProperty p div class col
  • iPhone应用程序全屏发送电子邮件

    我正在开发一个 iPhone 应用程序 用于使用内置图形和用户定义的文本创建图像 我希望能够拥有带有内置图形和用户定义文本的应用程序 然后可以将其作为单个图像 很像屏幕截图 发送到电子邮件应用程序以通过电子邮件发送 有没有一种方法可以做到这
  • 如何检查应用程序是否可移动到 SD

    我想知道如何通过代码检查应用程序是否可以移动到SD 我知道如何获取已安装的应用程序列表以及它是否在 SD 卡上 如果 ApplicationInfo 标志包含 ApplicationInfo FLAG EXTERNAL STORAGE 那么