Запись на внешнее хранилище?
Я написал коды из учебных пособий SLIDENERD для сохранения информации в различных областях, таких как внутренний кеш, внешний кеш, личная информация и общедоступная информация со следующими кодами.
EditText uname,pwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
uname=(EditText)findViewById(R.id.editText);
pwd=(EditText)findViewById(R.id.editText3);
}
public void intCache(View view){
File fileDir=getCacheDir();
File myFile=new File(fileDir,"User_info_intCache.txt");
write(myFile);
}
public void extCache(View view){
File fileDir=getExternalCacheDir();
File myFile=new File(fileDir,"User_info_extCache.txt");
write(myFile);
}
public void pvtDir(View view){
File fileDir=getExternalFilesDir("User_Info");
File myFile=new File(fileDir,"User_info_pvtExt.txt");
write(myFile);
}
public void pubDir(View view){
File fileDir= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File myFile=new File(fileDir,"User_info_pubExt.txt");
write(myFile);
}
private void write(File myFile){
String unameS=uname.getText().toString();
String pwdS=pwd.getText().toString();
FileOutputStream fileOutputStream=null;
try {
fileOutputStream=new FileOutputStream(myFile);
try {
fileOutputStream.write(unameS.getBytes());
fileOutputStream.write(pwdS.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
Toast.makeText(this,"data is written to "+myFile.getAbsolutePath(),Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Я могу видеть файлы user_info_extCache.txt, User_info_pvtExt.txt. Я знаю, что расположение внутреннего кэша ( User_info_intCache.txt) не видно. Но я не могу найти файл User_info_pubExt.txt, который должен храниться в общедоступном каталоге Downloads.It не могу увидеть файл, созданный с помощью следующего кода.
File fileDir= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File myFile=new File(fileDir,"User_info_pubExt.txt");
Тост показывает, что файл создан с помощью указанного выше фрагмента кода в /storage/emulated/0/Download/User_info_pubExt.txt .
Я нахожу где-то, что, если телефон подключен к компьютеру, внешнее хранилище не может быть доступно. Так что я попробовал и то, и другое, удалив мобильный телефон с компьютера. Тост говорит, что файл создан.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.iamka.storage">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Main2Activity"></activity>
</application>
1 ответ
Ваш тост, утверждающий, что данные записаны, находится не в том месте. Поскольку тост также отображается, когда есть исключение.
Вместо этого поместите тост в блок try. Или еще лучше после закрытия (), но только если вы закрыли ().
И поместите другие тосты в блоки улова, чтобы сообщить пользователю e.getMessage()
,
Что касается исключения: все пути, кроме последнего, вообще не нуждаются в разрешении на чтение / запись. Для последнего вам нужно разрешение на чтение / запись.
Но запрашивать их в манифесте недостаточно для Android 6+, так как тогда вам нужно добавить код, чтобы попросить пользователя подтвердить запрошенные разрешения.
Google для разрешения времени выполнения.