相关疑难解决方法(0)

解析/ proc /文件是否安全?

我想解析/proc/net/tcp/,但它安全吗?

我应该如何打开和读取文件,/proc/而不是害怕,某些其他进程(或操作系统本身)将在同一时间更改它?

c c++ unix linux procfs

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

如何使用为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万
查看次数

Android获得内部/外部内存的免费大小

我想以编程方式获取设备内部/外部存储空闲内存的大小.我正在使用这段代码:

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;
Log.e("","Available MB : "+megAvailable);

File path = Environment.getDataDirectory();
StatFs stat2 = new StatFs(path.getPath());
long blockSize = stat2.getBlockSize();
long availableBlocks = stat2.getAvailableBlocks();
String format =  Formatter.formatFileSize(this, availableBlocks * blockSize);
Log.e("","Format : "+format);
Run Code Online (Sandbox Code Playgroud)

而我得到的结果是:

11-15 10:27:18.844: E/(25822): Available MB : 7572
11-15 10:27:18.844: E/(25822): Format : 869MB
Run Code Online (Sandbox Code Playgroud)

问题是我想获得1,96GB现在的SdCard的免费记忆.如何修复此代码,以便获得免费大小?

android diskspace android-sdcard

89
推荐指数
10
解决办法
8万
查看次数

Android 6上的存储访问如何变化?

背景

Android在如何处理SD卡和存储方面有很多变化:

  • API 3 - 您获得所有访问权限,无需权限
  • API 4-15 - 您需要使用WRITE_EXTERNAL_STORAGE,并获得所有访问权限.
  • API 16-18 - 如果您只想阅读,请使用READ_EXTERNAL_STORAGE
  • API 19-20 - 您无法读取或写入辅助外部存储(SD卡),除非您的应用程序是系统应用程序,或者您拥有root用户.
  • API 21-22 - 为了访问SD卡,您需要请求用户许可,并使用DocumentFile API而不是File API.正如我在这里,这里这里所写的那样,这引发了许多问题.

从API 23(Android 6)开始,事情似乎再次发生变化......

问题

对于API 23,至少有两件新东西与存储相关:

  • " 可采用的存储设备 " - 用户可以选择将SD卡作为主要外部存储器.
  • 作为新权限机制(在运行时请求权限)的一部分,存储似乎也是用户需要确认的权限.这适用于READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE

由于没有配备SD卡的Android 6设备,并且因为模拟器本身并不能真正使用SD卡,所以仍然无法知道发生了什么.

问题

  1. SD卡是否可以使用File-API而不是DocumentFile获取访问权限?

  2. 如果我想访问所有外部存储路径(包括SD卡),这是否意味着我需要两次请求此权限:一个用于主外部存储,一个用于SD卡?

  3. 在手动授予许可之前,SD卡上的文件是否可以以任何方式访问?

  4. 假设用户选择使用"Adoptable Storage Devices",这对于检索应用程序文件路径的各种函数意味着什么?例如:getFilesDir,getExternalFilesDir,...?getExternalFilesDirs的oder会因为它而改变吗?

  5. 当用户将应用程序从SD卡移动到SD卡时(使用"可采用的存储设备"),应用程序的文件会发生什么变化?SD卡上的应用程序文件怎么样?他们会留下来吗?或者他们会搬到某个地方?

    例如,如果应用程序在SD卡上有"file1.txt",则在路径"/ storage/extSdCard/Android/data/appPackageName"上,它有一个文件"file2.txt"(或者甚至是同一个名字)在路径"/ storage/emulated/0/Android/data/appPackageName"上的主外部存储上.切换后,这些文件会发生什么?如果有的话,他们将如何合并到一个文件夹中?

  6. 将应用程序移动到SD卡(使用"Adoptable Storage Devices")时,是否意味着不会使用内部存储?

android sd-card android-permissions android-external-storage android-6.0-marshmallow

47
推荐指数
1
解决办法
3万
查看次数

Android:使用Storage Access Framework获取的URI中的意向选择器打开文件

一开始,用户可以使用新的存储访问框架选择文件(假设应用程序是API> 19):

https://developer.android.com/guide/topics/providers/document-provider.html

然后通过保存URI来保存对所选文件的引用,如下所示:

content://com.android.providers.downloads.documments/document/745
Run Code Online (Sandbox Code Playgroud)

(在这种情况下,文件来自默认下载dir`).

稍后,我想让用户打开这些文件(例如,他们的名字显示在UI列表中,用户选择一个).

我想用Android着名的意图选择器功能做到这一点,我所拥有的只是上面的URI对象......

谢谢,

android android-intent android-file storage-access-framework android-afilechooser

14
推荐指数
1
解决办法
7092
查看次数

如何使用ACTION_OPEN_DOCUMENT_TREE Intent获取真实路径?

我的应用程序下载并解压缩特定文件夹中的文件:

output = new FileOutputStream(realpath, true);
output.write(buffer, 0, bytesRead);

ZipFile zipFile = new ZipFile(realpath);
Run Code Online (Sandbox Code Playgroud)

随着新推出的ACTION_OPEN_DOCUMENT_TREEIntent,我想让用户选择该文件夹.

当测试我收到的值时onActivityResult,我会得到一个类似Path的路径/tree/primary:mynewfolder,这不是物理真实的路径/sdcard/mynewfolder.

Uri treeUri = data.getData();
String sPath = treeUri.getPath();
Log.v("Path from Tree ", sPath);
Run Code Online (Sandbox Code Playgroud)

我的解压方法需要真正的路径:

ZipFile zipFile = new ZipFile(realpath);
Run Code Online (Sandbox Code Playgroud)

如何/sdcard/mynewfolder从Lollipop(API 21和22)中提供的URI 获得真实路径?

android android-5.0-lollipop

11
推荐指数
1
解决办法
6973
查看次数

从Lollipop的google驱动器获取文件路径(MediaStore.MediaColumns.DATA == null)

当用户点击谷歌硬盘中的"发送文件"按钮并选择我的应用程序.我想获取该文件的文件路径,然后允许用户将其上传到其他位置.

我为kitkat手机检查了这些类似的SO帖子:从URI,Android KitKat新的存储访问框架获取真实路径

Android - 将URI转换为棒棒糖上的文件路径

然而,解决方案似乎不再适用于Lollipop设备.

问题似乎是MediaStore.MediaColumns.DATA在ContentResolver上运行查询时返回null.

https://code.google.com/p/android/issues/detail?id=63651

您应该使用ContentResolver.openFileDescriptor()而不是尝试获取原始文件系统路径."_data"列不是CATEGORY_OPENABLE合同的一部分,因此不需要Drive返回它.

我已经阅读了CommonsWare的这篇博文,其中建议我"尝试直接使用Uri直接使用ContentResolver",这是我不明白的.如何直接在ContentResolvers中使用URI?

但是,我仍然不清楚如何最好地处理这些类型的URI.

我能找到的最佳解决方案是调用openFileDescriptor,然后将文件流复制到一个新文件中,然后将该新文件路径传递给我的上传活动.

 private static String getDriveFileAbsolutePath(Activity context, Uri uri) {
    if (uri == null) return null;
    ContentResolver resolver = context.getContentResolver();
    FileInputStream input = null;
    FileOutputStream output = null;
    String outputFilePath = new File(context.getCacheDir(), fileName).getAbsolutePath();
    try {
        ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, "r");
        FileDescriptor fd = pfd.getFileDescriptor();
        input = new FileInputStream(fd);
        output = new FileOutputStream(outputFilePath);
        int read = 0;
        byte[] bytes = new byte[4096];
        while ((read …
Run Code Online (Sandbox Code Playgroud)

android android-intent google-drive-api storage-access-framework

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