我编写了一个简单的代码,用于将文件下载到特定目录(如果该文件不存在)。这是我的代码,它在某些设备中正常工作,而在其他设备中则不然(我知道它看起来很荒谬):
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.这个代码适用于三星J2与Android 5.1和华为与Android 4.4。 在使用android 4.2的HTC愿望中,每次下载beacausemyfile.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)
答案 0 :(得分:3)
使用以下代码检查具有不同版本的文件路径。
getBaseContext().getFilesDir();
在4.0版本中,路径为
“/数据/数据/ com.androidexample.splashscreen /文件”。
在6.0版本中,路径为
“/数据/用户/ 0 / com.androidexample.splashscreen /文件”。
答案 1 :(得分:1)
问题解决了!
正如我在问题中所说,HTC和三星都有外部存储器,但HTC使用SD卡存储文件,而三星则使用内部存储器。
我想也许这就是我的设备的问题。我重启HTC几次但没有发生任何事。然后我从HTC中删除了SDcard。我震惊的一切都很好用内存!!!然后我再次放回SDcard(我应该关闭以弹出或放入SD卡)然后再次工作!!!现在它有两个记忆,但它使用内部存储器来存储文件。
我真的很困惑这个存储系统。