相关疑难解决方法(0)

如何使用为Android 5.0(Lollipop)提供的新SD卡访问API?

背景

Android 4.4(KitKat)上,谷歌已经限制了对SD卡的访问.

从Android Lollipop(5.0)开始,开发人员可以使用新的API,要求用户确认允许访问特定文件夹,如此Google-Groups帖子所述.

问题

该帖子指导您访问两个网站:

这看起来像是一个内部示例(可能稍后会在API演示中显示),但很难理解发生了什么.

这是新API的官方文档,但它没有详细说明如何使用它.

这是它告诉你的:

如果您确实需要完全访问整个文档子树,请首先启动ACTION_OPEN_DOCUMENT_TREE以允许用户选择目录.然后将生成的getData()传递给fromTreeUri(Context,Uri)以开始使用用户选择的树.

在导航DocumentFile实例树时,您始终可以使用getUri()来获取表示该对象的基础文档的Uri,以便与openInputStream(Uri)等一起使用.

要在运行KITKAT或更早版本的设备上简化代码,可以使用fromFile(File)来模拟DocumentsProvider的行为.

问题

我对新API有几个问题:

  1. 你是如何真正使用它的?
  2. 根据帖子,操作系统会记住应用程序被授予访问文件/文件夹的权限.你如何检查你是否可以访问文件/文件夹?是否有一个函数可以返回我可以访问的文件/文件夹列表?
  3. 你如何在Kitkat上处理这个问题?它是支持库的一部分吗?
  4. 操作系统上是否有设置屏幕,显示哪些应用可以访问哪些文件/文件夹?
  5. 如果在同一设备上为多个用户安装了应用程序,会发生什么?
  6. 是否有关于这个新API的任何其他文档/教程?
  7. 权限可以被撤销吗?如果是这样,是否有意图被发送到应用程序?
  8. 是否会在所选文件夹上递归请求权限工作?
  9. 使用该权限是否也允许用户有机会根据用户的选择进行多次选择?或者应用程序是否需要专门告知意图允许哪些文件/文件夹?
  10. 模拟器上有没有办法尝试新的API?我的意思是,它有SD卡分区,但它作为主要外部存储器,所以已经给出了所有访问权限(使用简单的权限).
  11. 当用户用另一张SD卡替换SD卡时会发生什么?

android android-sdcard android-5.0-lollipop documentfile

113
推荐指数
2
解决办法
7万
查看次数

如何在不使用文件或文件路径的情况下获取文件系统(不仅仅是已安装的文件)中APK文件的信息?

背景

我的应用程序(在此处)可以在整个文件系统(不仅是已安装的应用程序)中搜索APK文件,显示有关每个文件的信息,允许删除,共享,安装...

作为Android Q范围内存储功能的一部分,Google宣布SAF(存储访问框架)将取代常规存储权限。这意味着,即使您尝试使用存储权限,也只会授予访问特定类型的文件的权限,以使File和file-path可以使用或完全沙箱化(在此处撰写)。

这意味着许多框架将需要依赖SAF而不是File和file-path。

问题

其中之一是packageManager.getPackageArchiveInfo,它给出了文件路径,返回 PackageInfo,我可以得到有关以下内容的各种信息:

  1. 名称(在当前配置上),使用,也称为“标签” packageInfo.applicationInfo.loadLabel(packageManager)。这基于设备的当前配置(语言环境等)。
  2. 包名称,使用 packageInfo.packageName
  3. 版本代码,使用packageInfo.versionCodepackageInfo.longVersionCode
  4. 版本号,使用 packageInfo.versionName
  5. 应用图标,根据当前配置(密度等...)以各种方式使用:

一种。 BitmapFactory.decodeResource(packageManager.getResourcesForApplication(applicationInfo),packageInfo.applicationInfo.icon, bitmapOptions)

b。如果已安装,AppCompatResources.getDrawable(createPackageContext(packageInfo.packageName, 0), packageInfo.applicationInfo.icon )

C。 ResourcesCompat.getDrawable(packageManager.getResourcesForApplication(applicationInfo), packageInfo.applicationInfo.icon, null)

它还有很多其他功能,它们可以返回您,还有很多可选功能,但我认为这些是有关APK文件的基本详细信息。

我希望Google可以为此提供一个很好的替代方法(在此此处要求),因为目前我找不到任何好的解决方案。

我尝试过的

使用从SAF获得的Uri并从中获得InputStream很容易:

@TargetApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    packageInstaller = packageManager.packageInstaller

    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
    intent.addCategory(Intent.CATEGORY_OPENABLE)
    intent.type = "application/vnd.android.package-archive"
    startActivityForResult(intent, 1)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { …
Run Code Online (Sandbox Code Playgroud)

android inputstream apk android-package-managers scoped-storage

51
推荐指数
2
解决办法
1519
查看次数

Android-在应用程序中创建符号链接

我想在我的应用中以编程方式创建符号链接。在Android(4.4+)中可以吗?

在Java中,我们可以使用:

Path newLink = ...;
Path target = ...;
try {
    Files.createSymbolicLink(newLink, target);
} catch (IOException x) {
    System.err.println(x);
} catch (UnsupportedOperationException x) {
    // Some file systems do not support symbolic links.
    System.err.println(x);
}
Run Code Online (Sandbox Code Playgroud)

java.nio.file但我应该在Android中使用?

https://docs.oracle.com/javase/tutorial/essential/io/links.html

编辑:

我测试使用reflection/native code/OS.symlink() method,没有任何工作。我总是收到不允许的操作(EPERM)。我认为您必须具有root权限才能创建符号链接。

问题可能/mnt/sdcard在于包装的FUSE垫片/data/media/xxx。所以我开始使用,/data/media/xxx但我总是得到Permission denied

我认为root权限存在问题。

java filesystems symlink android android-ndk

5
推荐指数
1
解决办法
2058
查看次数