【问题标题】:Android: file.exists return always false in downloading and storing a file is some devicesAndroid:file.exists 在下载和存储文件时总是返回 false 是某些设备
【发布时间】:2016-04-06 16:01:15
【问题描述】:

我编写了一个简单的代码来将文件下载到特定目录(如果它不存在)。这是我的代码,它在某些设备上正常工作,而在其他一些设备上却不行(我知道这看起来很荒谬):

try {
        File direct = new File(Environment.getExternalStorageDirectory().toString() + "/abredanesh/library");
        boolean result = false;
        if(!direct.exists())
            result = direct.mkdirs();

        File myfile = new File(Environment.getExternalStorageDirectory() + "/abredanesh/library","/a.pdf");
        if (!myfile.getAbsoluteFile().exists()) {

            DownloadManager mgr = (DownloadManager) this.getSystemService(Context.DOWNLOAD_SERVICE);

            Uri downloadUri = Uri.parse(url);
            DownloadManager.Request request = new DownloadManager.Request(downloadUri);

            request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI
                    | DownloadManager.Request.NETWORK_MOBILE);
            request.setAllowedOverRoaming(false).setTitle("ابر دانش");
            request.setDescription("دانلود کتاب");
            request.setDestinationInExternalPublicDir("abredanesh/library/", "a.pdf");

            mgr.enqueue(request);
        }
    } catch (Exception e) {
        Log.e("PARSE_ERROR", e.toString());
        e.printStackTrace();
    }

这是我的权限列表:

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
<uses-permission android:name="android.permission.ACCESS_ALL_DOWNLOADS" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED" />

<!-- This app has permission to register and receive data message. -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- This app has permission to register and receive data message. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="com.ghaleh.football.permission.C2D_MESSAGE" />

<!-- permission if the application needs to keep the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />

我的目标 android 版本是 23。此代码在带有 android 5.1 的三星 J2 和带有 android 4.4 的华为中运行良好。 在使用 android 4.2 的 HTC 愿望中,它每次都下载文件,因为 myfile.getAbsoluteFile().exists() 返回 false。 (myfile.exists() 和 myfile.canread())。 在带有 android 6 的 Nexus 5 中,它显示创建文件夹和下载文件夹的权限错误。

三星和 HTC 都有外部存储器,而华为和 Nexus 没有。此代码在三星内部存储器中创建文件夹和文件,并在 HTC 中使用外部存储器!

我的代码有什么问题?我需要其他权限吗?为什么这些设备都不像下一个那样工作!!!我看过很多关于 file.exist 的页面和问题,但是没有一个答案适用于我的所有设备。

================================================ =======

编辑:

按照@draksia 的建议,我尝试打开文件。我使用此代码打开文件:

            Intent target = new Intent(Intent.ACTION_VIEW);
        target.setDataAndType(Uri.fromFile(myfile), "application/pdf");
        target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

        Intent intent = Intent.createChooser(target, "Open File");
        try {
            startActivity(intent);
        } catch (ActivityNotFoundException e) {
            // Instruct the user to install a PDF reader here, or something
        }

Samsung 和 Huasei 打开文件,但 HTC 给出此错误“无法打开此文档”。 (我有一些应用可以在 HTC 上打开 pdf)

【问题讨论】:

  • 如果您尝试打开文件而不是仅仅检查它是否存在,它会打开还是抛出错误?
  • In Nexus 5 with android 6 it shows permission error for creating folder and downloading it. 因为在 Android 6 中权限系统发生了变化。
  • @BobMalooga 我的目标版本是23。Android 6 权限系统是否与目标版本相关?
  • @draksia 在我编辑问题时,无法在 HTC 中打开该文件!
  • 不是我说的吗? in Android 6 the permission system changed.。 API 级别 23 Android 6

标签: android file


【解决方案1】:

使用以下代码检查不同版本的文件路径。

getBaseContext().getFilesDir();

4.0版本路径是

“/data/data/com.androidexample.splashscreen/files”。

在6.0版本中路径是

“/data/user/0/com.androidexample.splashscreen/files”。

【讨论】:

  • 它返回 "/data/data/com.example.testapp.pdfreader/files/abredanesh/library/a.pdf" 这不是我的文件的正确位置。
【解决方案2】:

问题解决了!

正如我在问题中所说,HTC 和三星都有外部存储器,但是 HTC 使用 SD 卡存储文件,而三星使用内部存储器。

我想这可能是我的设备的问题。我重启了 HTC 几次,但什么也没发生。然后我从 HTC 中删除了 SDcard。我震惊了,使用内部存储器一切都很好!!!!然后我又把 SDcard 放回去(我应该关闭以弹出或放入 SDcard),它又工作了!!!现在它有两个内存,但它使用内部存储器来存储文件。

我真的对这个存储系统感到困惑。

【讨论】:

    猜你喜欢
    • 2013-03-26
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2015-10-20
    • 2012-12-12
    • 2016-03-11
    • 1970-01-01
    相关资源
    最近更新 更多