Запись на внешнее хранилище?

Я написал коды из учебных пособий 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 для разрешения времени выполнения.

Другие вопросы по тегам