【发布时间】: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