标签: android-storage

ACTION_GET_CONTENT 意图不显示外部存储

我正在为我的 Android 应用实现导入功能。我想让用户选择他们想要从他们设备上的外部存储(确切地说是下载目录)和其他在线文件存储(如 DropBox 和 Google Drive)导入的文件。

我实现了它并在一个模拟器和两个安卓设备上进行了测试。当我在模拟器上测试它时,Android 版本 6.0,因为它没有安装 DropBox 和 GoogleDrive,我看到了我所期待的,它能够从下载目录中选择一个文件: 在此处输入图片说明

当我在 Google Pixel 手机 Android 版本 7.1.2 上对其进行测试时,一切都按我的预期工作。我可以从下载目录、Google Drive 和 DropBox 中选择一个文件: 在此处输入图片说明

但是,当我在三星 Galaxy 4 设备 Android 版本 5.0.1 上对其进行测试时,我可以从 Google Drive 和 Dropbox 中选择一个文件,但是我无法从我的下载目录中选择一个文件: 在此处输入图片说明

这是我选择文件的代码:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("text/*");
startActivityForResult(intent, GET_FILE_RESULT_CODE);
Run Code Online (Sandbox Code Playgroud)

请让我知道我可以做些什么来解决这个问题。谢谢!

android android-intent android-file android-external-storage android-storage

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

有没有一种直接的方法可以从文件 Uri 中获取父目录的 Uri?

假设一个 Uri 可以是以下之一:

  • 来自存储访问框架的 DocumentFile(即 DocumentFile.getUri())的 Uri。
  • 来自常规文件的 Uri(即 Uri.fromFile(File))

在这两种情况下,它都指目录下的文件。

有没有一种直接的方法来获取其父目录的 Uri 而不尝试两者中的每一个来查看哪个有效?

[编辑]:以下是 SAF 的示例:

乌里:

content://com.android.externalstorage.documents/tree/0000-0000%3Atest/document/0000-0000%3Atest%2Ffoo%2FMovies%2FRR%20parking%20lot%20a%202018_02_22_075101.mp4
Run Code Online (Sandbox Code Playgroud)

获取路径():

/tree/0000-0000:test/document/0000-0000:test/foo/Movies/RR 停车场 a 2018_02_22_075101.mp4

getPathSegments():

0 = "tree"
1 = "0000-0000:test" 
2 = "document"
3 = "0000-0000:test/foo/Movies/RR parking lot a 2018_02_22_075101.mp4"
Run Code Online (Sandbox Code Playgroud)

父文件夹应该是 test/foo/Movies。

以下是常规文件的示例:

乌里:

file:///storage/emulated/0/foo/Movies/RR%20parking%20lot%20a%202018_02_22_081351.mp4

获取路径():

/storage/emulated/0/foo/Movies/RR 停车场 a 2018_02_22_081351.mp4

getPathSegments():

0 = "storage"
1 = "emulated"
2 = "0"
3 = "foo"
4 = "Movies"
5 = "RR parking lot a 2018_02_22_081351.mp4"
Run Code Online (Sandbox Code Playgroud)

android-file storage-access-framework android-storage

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

Android:仅限文件夹选择器

我有一个应用程序,当我按下按钮时,它应该打开文件夹选择器并允许用户仅浏览和选择文件夹。然后我想获取该文件夹的路径,以便我可以对其进行一些操作。

我尝试过使用这段代码:

val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.type = "*/*"
startActivityForResult(intent, 8778)
Run Code Online (Sandbox Code Playgroud)

但这不起作用。

您能帮我提供一些代码吗?

android android-file kotlin android-storage

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

如何在没有系统确认对话框的情况下删除 Android 11 (API 30) 上的文件?

我有一个将视频录制到共享 MOVIES 文件夹的应用程序。

我可以使用contentResolver.delete(uri, null, null)我录制的视频活动中的方法删除 Android 11 (API 30) 上的这些文件。

但是,如果我重新安装该应用程序,那么它就会失去对这些文件的权限......(如此糟糕),在这种情况下,我需要做这样的事情:

try {
    context.contentResolver.delete(uri, null, null)
} catch (exception: Exception) {
    if (exception is RecoverableSecurityException) {
        val intentSender = exception.userAction.actionIntent.intentSender
        intentSender?.let {
            callback?.startIntentSenderForResult(
                intentSender,
                requestCode
            )
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此它无法删除文件,ContentResolver因为应用程序已重新安装,并且有一个例外,我们可以捕获并打开下一个烦人的对话框以供用户确认删除(并且对于每个文件删除,它应该是一个不同的对话框,多次删除 - 否道路)

在此处输入图片说明

然后我在这个 Android 11 设备(模拟器)上安装了来自 Google Play 的 Explorer 应用程序,当我打开它时,该应用程序只要求存储写入权限(我的应用程序也这样做)并且这个 Explorer 应用程序可以轻松删除任何文件(包括我录制的视频)文件)没有任何确认对话框。

那么他们是如何做到的呢?这是一个黑客还是什么?

链接到应用程序https://play.google.com/store/apps/details?id=com.speedsoftware.explorer

更新

VLC for Android 也可以删除任何媒体文件https://play.google.com/store/apps/details?id=org.videolan.vlc

他们也使用内容提供程序,所以它是一样的,但它返回的true不像我的应用程序,为什么?

fun deleteFile(file: File): Boolean {
    var deleted: Boolean
    //Delete from …
Run Code Online (Sandbox Code Playgroud)

android android-file android-storage android-11

5
推荐指数
2
解决办法
3673
查看次数

如何下载并保存内部存储中的媒体文件 android java

我想从互联网上下载一些音频文件。我想使用downloadmanager下载这个文件,但我不知道如何将这些文件保存到android中的特定内部存储位置。InternalStorage/folder/filename.mp3(这样我就可以轻松访问它们)。

manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                Uri uri = Uri.parse("URL");
                DownloadManager.Request request = new DownloadManager.Request(uri);
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
                long reference = manager.enqueue(request);
Run Code Online (Sandbox Code Playgroud)

对于下载很有用。但我们无法指定这些文件的位置。

那么如何指定这些文件保存在内部存储的特定位置呢?还有,如何access使用delete这些文件。

请不要提出这个问题,因为我在阅读很多文章时感到困惑。

如果有其他更好的选择或任何建议请评论

android android-download-manager android-internal-storage android-storage

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

遍历文档文件树

我正在尝试递归地遍历 Android DocumentFile 树,但无法获取要为子文件夹返回的文件列表。当我在文件夹 URI 上尝试 listFiles() 时,每次都会返回根文件列表。

为什么这不起作用?

package com.example.usbfoldertest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.documentfile.provider.DocumentFile;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "USBFolderTest";
    private static final int RQS_OPEN_DOCUMENT_TREE = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
        startActivityForResult(intent, RQS_OPEN_DOCUMENT_TREE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if(resultCode == RESULT_OK && requestCode == RQS_OPEN_DOCUMENT_TREE){
            Uri uriTree = data.getData(); …
Run Code Online (Sandbox Code Playgroud)

android documentfile android-storage

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

如何在 Android API LEVEL28 使用 Android SAF(存储访问框架)之后将文档文件保存在外部存储中

此代码适用于媒体文件我想要文档文件的解决方案

我不知道如何为文档文件添加 contentValues

fun getFile(fileName: String): File? {
    with(sharePrefHelper.app){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            val values = ContentValues()
            // Here is My Question That what should i Do Here Because this is for document not for image
            values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
            // for MIME_TYPE "image/jpg" this is working
            values.put(MediaStore.Images.Media.MIME_TYPE, "text/csv")
            values.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/Donny")
            contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)?.let {
                it.path?.let { finalPath ->
                    return File(finalPath)
                }
            }
        } else {
            val directory: File = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM + "/Donny")
            if (!directory.exists()){
                directory.mkdirs()
            }
            return File(directory, fileName)
        }
        return …
Run Code Online (Sandbox Code Playgroud)

android android-storage

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

Android PackageStats始终为零

我正在尝试获取应用程序包占用的大小.每个应用程序在内部/外部存储中都有一个位置.

我想计算以下目录的大小,我该怎么做?我知道我可以在Oreo(API 26)设备上使用StorageStateManager,但是如何在oreo设备之前实现这一点.

应用目录: /Android/data/myapplicationpackage

我正在尝试使用PackageStats,但它总是给我零.使用此代码的实际方法是什么?

我使用了以下代码,它给了我全部零.

PackageStats stats = new PackageStats(context.getPackageName());
    long codeSize  = stats.codeSize + stats.externalCodeSize;
    long dataSize  = stats.dataSize + stats.externalDataSize;
    long cacheSize = stats.cacheSize + stats.externalCacheSize;
    long appSize   = codeSize + dataSize + cacheSize;
Run Code Online (Sandbox Code Playgroud)

java android android-package-managers android-storage

4
推荐指数
1
解决办法
1012
查看次数

使用Android意图打开PDF文件

所以这是场景:

我正在从网络下载 PDF 并将其保存在/0/Download/NSIT - Notices/"fileName".pdf

现在发送 Intent 像这样:

private void openPDF(String fileName) {
    Log.d(TAG, "openPDF: called");
    Intent intent = new Intent(Intent.ACTION_VIEW);File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download", "NSIT - Notices");
    File myPDF = new File(Environment.getExternalStorageDirectory() + "/Download/NSIT - Notices", fileName + ".pdf");
    Uri uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", myPDF);
    Log.d(TAG, "openPDF: intent with uri: " + uri);
    intent.setDataAndType(uri, "application/pdf");
    context.startActivity(Intent.createChooser(intent, "Open with..."));
}
Run Code Online (Sandbox Code Playgroud)

现在任何 PDF 阅读器(Google Drive PDF 阅读器、系统 PDF 查看器)都在说

The File Does Not Exist
Run Code Online (Sandbox Code Playgroud)

图像: 在此输入图像描述

谷歌没有做任何事情(这就是为什么不包括它的图像)

Mainfest.xml

<provider
        android:name="android.support.v4.content.FileProvider" …
Run Code Online (Sandbox Code Playgroud)

pdf android android-intent android-fileprovider android-storage

4
推荐指数
1
解决办法
8287
查看次数

在应用程序中创建 CSV 或 TXT 文件并将其保存到“下载”文件夹 - Android

在问这个问题之前我进行了很多搜索和尝试。但我尝试的所有代码都不起作用。我希望该文件存储在该download文件夹中,并且在用户卸载该应用程序时也可以访问该文件。我也尝试过使用opencsv库。您能否提供一种tested创建csvtxt文件并将其存储到download文件夹的方法?

csv android opencsv android-download-manager android-storage

4
推荐指数
1
解决办法
4567
查看次数