我写了一个简单的代码,将文件下载到特定的目录中,如果它不存在的话。这是我的代码,它在某些设备中可以正常工作,而在其他设备中却不能正常工作(我知道这似乎很荒谬):
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" />
我的目标安卓版本是23。此代码在三星J2的安卓5.1和华为的安卓4.4中运行良好。在HTC的愿望与android 4.2它下载文件每次beacausemyfile.getAbsoluteFile().exists()返回false。(myfile.exists()和myfile.canread())。在Nexus 5与安卓6它显示了创建文件夹和下载它的权限错误。
三星和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
}
三星和华盛打开了文件,但HTC给出了这个错误"这个文档无法打开。"(我有一些应用程序可以在HTC上打开pdf)
使用以下代码检查不同版本的文件路径。
getBaseContext().getFilesDir();
在4.0版本中,路径为
"/data/data.com/androidexample.ssplashscreen/files".
在6.0版本中,路径为
"/data/user/0.com/androidexample.ssplashscreen/files".
问题解决了!
正如我在问题中所说,HTC和三星都有外部存储器,但HTC使用SD卡存储文件,三星使用内部存储器。
我想这可能是我的设备出了问题。我重启HTC几次,但什么都没发生。然后我从HTC移除SD卡。我震惊了一切,使用内部记忆工作得很好!!!然后我再次放回SD卡(我应该关闭弹出或放SD卡),它又工作了!!!现在它有两个内存,但它使用内部内存来存储文件。
我真的对这个存储系统感到困惑。