标签: android-file

应用程序内部存储器上的mkdirs()在Android上失败

在我的应用程序中,当我尝试在应用程序内部存储下创建目录结构时,我看到很少崩溃,例如/data/data/[pkgname]/x/y/z....

这是失败的代码:

File clusterDirectory = new File(MyApplication.getContext().getFilesDir(), "store");
File baseDirectory = new File(clusterDirectory, "data");
if (!baseDirectory.exists()) {
    if (!baseDirectory.mkdirs()) {
        throw new RuntimeException("Can't create the directory: " + baseDirectory);
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试创建以下路径时,我的代码抛出了异常:

java.lang.RuntimeException: Can't create the directory: /data/data/my.app.pkgname/files/store/data
Run Code Online (Sandbox Code Playgroud)

我的清单指定了权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />,即使它不需要用于此目的(由于Google Maps Android API v2,我的应用程序实际上是必需的).

它似乎与手机没有关系,因为我在旧手机和新手机上都有这个例外(最新的崩溃报告是Nexus 4和Android 4.3).

我的猜测是该目录/data/data/my.app.pkgname首先不存在,但由于权限问题,mkdirs()无法创建它,这可能吗?

任何提示?

谢谢

android android-file

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

列出设备上具有特定扩展名的所有文件

我想在设备上找到所有文件,在我的情况下是 pdf。现在我写了这段代码:

File images = Environment.getExternalStorageDirectory();
        mImagelist = images.listFiles(new FilenameFilter(){
            public boolean accept(File dir, String name)
            {
                return ((name.endsWith(".pdf")));
            }
        });
Run Code Online (Sandbox Code Playgroud)

此代码仅找到一个 pdf
/storage/emulated/0/HTC_One_WWE_User_Guide.pdf。我的下载文件夹中还有其他几个 pdf。

我该如何解决这个问题?

android android-file android-external-storage

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

将文件发送到Http时,OutputStream内存不足错误

较小的文件会成功上传到服务器,但当它来到较大的文件时,下面的代码会抛出内存不足错误.任何解决方案 .提前致谢.

public void addFilePart(String fieldName, File uploadFile)
                throws IOException {
            String fileName = uploadFile.getName();
            writer.append("--" + boundary).append(LINE_FEED);
            writer.append(
                    "Content-Disposition: form-data; name=\"" + fieldName
                            + "\"; filename=\"" + fileName + "\"")
                    .append(LINE_FEED);
            writer.append(
                    "Content-Type: "
                            + URLConnection.guessContentTypeFromName(fileName))
                    .append(LINE_FEED);
            writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
            writer.append(LINE_FEED);
            writer.flush();

            FileInputStream inputStream = new FileInputStream(uploadFile);
            byte[] buffer = new byte[4096];
            int bytesRead = -1;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            outputStream.flush();
            inputStream.close();

            writer.append(LINE_FEED);
            writer.flush();
        }
Run Code Online (Sandbox Code Playgroud)

java android android-file

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

FileProvider 正在打开一个 PDF,但它是空白的。为什么?

FileProvider我的应用程序中有一个,它假装它正在工作,但它打开的文件是空白的。我已经确认该文件已经在设备上的指定目录中并且不是空白的,但是当我尝试从我的应用程序内部打开它时它失败了。没有崩溃,也没有错误信息。有没有人见过这个?

文件提供者:

<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.my.redacted.provider" android:exported="false" android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" />
        </provider>
Run Code Online (Sandbox Code Playgroud)

provider_paths.xml

<?xml version="1.0" encoding="utf-8" ?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <external-path name="external_storage" path="." />
</paths>
Run Code Online (Sandbox Code Playgroud)

编码:

    var path = "/storage/emulated/0/MyApp/User/attachments/folder/attachment.pdf"
    var file = new Java.IO.File(path);
    var mime = MimeTypeMap.Singleton;
    var ext = MimeTypeMap.GetFileExtensionFromUrl(path).ToLower();
    var type = mime.GetMimeTypeFromExtension(ext);

    var intent = new Intent();
    intent.SetAction(Intent.ActionView);
    var name = activity.PackageName + ".provider";
    var uri = FileProvider.GetUriForFile(activity.ApplicationContext, name, file);
    intent.SetDataAndType(uri, type);
    intent.SetFlags(ActivityFlags.GrantReadUriPermission);
    intent.SetFlags(ActivityFlags.GrantWriteUriPermission);

    var packageManager = activity.PackageManager;
    if (intent.ResolveActivity(packageManager) != null)
        activity.RunOnUiThread(() => activity.StartActivity(intent)); …
Run Code Online (Sandbox Code Playgroud)

android xamarin.android android-file android-fileprovider

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

意图 ACTION_OPEN_DOCUMENT_TREE 似乎没有返回驱动的真实路径

我正在尝试从连接到我的 Google Pixel 的 USB 存储设备读取文件。我目前正在使用这种方法来选择驱动器的路径,以便我可以查询它的内容

private static final String TAG = "MainActivity";
private static final int REQUEST_CHOOSE_DRIVE = 1;
private TextView tv;

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

    tv = (TextView) findViewById(R.id.text);

    Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);

    startActivityForResult(i, REQUEST_CHOOSE_DRIVE);
}

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

        Uri uri = data.getData();

    }
}
Run Code Online (Sandbox Code Playgroud)

但是,Uri 看起来像是/tree/...在 Android 文件系统中似乎不是真实路径(通过 验证adb shell)。如何使用它uri来查询便携式存储设备的内容?我尝试使用此处给出的答案但链接的函数返回 …

android android-file android-fileprovider

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

getFilesDir() 与 getExternalFilesDir(),更推荐哪一个?

据我所知,用于getFilesDir()存储数据(在我的例子中是相机捕获的数据)有点临时。我这么说是因为如果我关闭并重新打开应用程序,我可以访问目录和文件列表,但不能访问文件本身。

是我的逻辑错误还是有意为之?
两种方法中,更推荐以下方法:

  1. 一般的
  2. 我的情况(需要隐私)

java android android-file

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

Android 11 更新破坏了我的文件写入代码

我之前使用过这个片段来编写一个带有名称和正文的简单文本文件:

public static File writeTextFile(String sFileName, String sBody) throws IOException {
        File root = new File(Environment.getExternalStorageDirectory(), FOLDER_NAME);

    if (!root.exists()) {
        logFile("Not yet created, creating right now: " + root.getPath());
        root.mkdirs();

        logFile("Creation was successful? " + (root.exists() ? "Yes." : "No."));

    } else {
        logFile("Path exists: " + root.getPath());
    }

  
    File       measurementFile = new File(root, sFileName);
    FileWriter writer  = new FileWriter(measurementFile);
    writer.append(sBody);
    writer.flush();
    writer.close();

    return measurementFile;

}
Run Code Online (Sandbox Code Playgroud)

除了 Android 11 之外,它运行良好,我今天在运行 Android 11 的 OnePlus N10 上进行测试后才意识到这一点。


问题是我没有收到任何描述的错误消息,只是一个简单的异常 …

android android-file android-11

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

是否可以使用内部存储创建和维护包含文件的文件夹结构

我研究了下面的链接,但它没有回答我的问题. http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

如果标题中的问题答案是肯定的.有人可以提供一个简单的例子来创建一个子文件夹并将文件添加到该文件夹​​吗?并且可能会显示如何从子文件夹中读取文件?

或者也许告诉我为什么下面的例子悲惨地失败了

更改file.mkdirs()立即工作; to file.getParentFile().mkdirs();
请参阅以下答案中的说明

public static void Test(String path, String fileName, String fileStr, Context ctx)
{

    SaveFile(path, fileName, fileStr, ctx);
    String returnFileStr = ReadFile(path, fileName, ctx);
}
public static Boolean pathExists(String path, Context ctx)
{
    Boolean result = false;
    String[] pathSeqments = path.split("/");
    String pathStr = "";
    for(int i = 0;i<pathSeqments.length;i++ )
    {
        pathStr += pathSeqments[i];
        if(!new File(ctx.getFilesDir() +"/" + pathStr).exists())
        {
            result = false;
            break;
        }
        pathStr += "/";
        result = true; …
Run Code Online (Sandbox Code Playgroud)

android android-file

2
推荐指数
1
解决办法
2342
查看次数

Android DownloadManager保存到下载文件夹

我正在使用DownloadManager下载文件,我想将下载放在标准下载文件夹中,以便人们可以使用文件管理器在最明显的位置轻松找到它们:

Uri downloadLocation = Uri.fromFile(new File(Environment.DIRECTORY_DOWNLOADS, filename));
request.setDestinationUri(downloadLocation);
Long reference = downloadManager.enqueue(request);
Run Code Online (Sandbox Code Playgroud)

但我得到一个例外,因为那不是外部驱动器.

有没有办法将文件下载到用户的下载文件夹?

而且,如果他们没有外部记忆,只是内部?

谢谢.

android android-file android-download-manager

2
推荐指数
1
解决办法
6884
查看次数

这是ExifInterface中的错误吗?

我的问题是,在某些设备上,从库中选取后,一些图像在ImageView中旋转.我发现了很多使用ExifInterface来解决这个问题的信息,所以我尝试使用它.但是当我尝试使用图像路径创建ExifInterface实例时,我有一个奇怪的例外.

W/ExifInterface: Invalid image
java.io.IOException: Invalid marker: 89
at android.media.ExifInterface.getJpegAttributes(ExifInterface.java:1598)
at android.media.ExifInterface.loadAttributes(ExifInterface.java:1334)
at android.media.ExifInterface.<init>(ExifInterface.java:1052)
at com.igeotrack.igeo.ui.fragment.ProfileFragment.modifyOrientation(ProfileFragment.java:554)
at com.igeotrack.igeo.ui.fragment.ProfileFragment.setLogo(ProfileFragment.java:515)
at com.igeotrack.igeo.ui.fragment.ProfileFragment.onViewCreated(ProfileFragment.java:186)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1127)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:536)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5433)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

我的道路没有错,因为我之前使用它并且它有效.这是我的代码.

        private void setLogo() {
        File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
                + "/Android/data/"
                + getActivity().getPackageName()
                + "/Files");

        String mImageName="iGeoTrackUserAvatar.jpg";

        File mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);

//        if (mediaFile.exists()) …
Run Code Online (Sandbox Code Playgroud)

android android-imageview android-file

2
推荐指数
1
解决办法
4006
查看次数