Сохранение файла в хранилище программно - PullRequest
0 голосов
/ 29 января 2020

Я пытался использовать следующий код: (Ранее он работал нормально, сейчас я тестирую, что он не работает, может быть из-за android 10 или какой-то другой ошибки).

    import android.os.Bundle;
    import android.support.design.widget.FloatingActionButton;
    import android.support.design.widget.Snackbar;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.View;
    import android.view.WindowManager;

    public class AboutUs extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_about_us);
            Toolbar toolbar = findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
             new DownloadFile().execute("https://4.img-dpreview.com/files/p/E~TS590x0~articles/3925134721/0266554465.jpeg");

        }


     private class DownloadFile extends AsyncTask<String,Integer, String> {
            private PowerManager.WakeLock mWakeLock;

            @Override
            protected String  doInBackground(String... strings) {
                String fileUrl = strings[0];  
                String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
                File folder = new File(extStorageDirectory, "MyFolder");
                folder.mkdir();

                File pdfFile = new File(folder, fileUrl);

                try{
                    pdfFile.createNewFile();
                }catch (IOException e){
                    e.printStackTrace();
                }
                FileDownloader.downloadFile(fileUrl, pdfFile);
                return null;
            }
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                // take CPU lock to prevent CPU from going off if the user
                // presses the power button during download
                PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
                mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                        getClass().getName());
                mWakeLock.acquire();
                mProgressDialog.show();
            }

            @Override
            protected void onProgressUpdate(Integer... progress) {
                super.onProgressUpdate(progress);
                // if we get here, length is known, now set indeterminate to false
                mProgressDialog.setIndeterminate(false);
                mProgressDialog.setMax(100);
                mProgressDialog.setProgress(progress[0]);
            }


            @Override
            protected void onPostExecute(String result) {
                mWakeLock.release();
                mProgressDialog.dismiss();
                if (result != null)
                    Toast.makeText(context,"Download error: "+result, Toast.LENGTH_LONG).show();
                else {
                    Toast.makeText(context, "File downloaded", Toast.LENGTH_SHORT).show();
                    activity.startActivity(activity.getIntent());
                    activity.finish();
                }
            }
        }
        public static class FileDownloader {
            private static final int  MEGABYTE = 1024 * 1024;

            public static void downloadFile(String fileUrl, File directory){
                try {

                    URL url = new URL(fileUrl);
                    HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
                    urlConnection.setRequestMethod("GET");
                    urlConnection.setDoOutput(true);
                    urlConnection.connect();

                    InputStream inputStream = urlConnection.getInputStream();
                    FileOutputStream fileOutputStream = new FileOutputStream(directory);
                    int totalSize = urlConnection.getContentLength();

                    byte[] buffer = new byte[MEGABYTE];
                    int bufferLength = 0;
                    while((bufferLength = inputStream.read(buffer))>0 ){
                        fileOutputStream.write(buffer, 0, bufferLength);
                    }
                    fileOutputStream.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        }

Я пробовал с вышеуказанным кодом. Я добавил WRITE_INTERNAL_STORAGE, а также спрашиваю разрешение во время выполнения

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Android 10 требуется android:requestLegacyExternalStorage="true" в вашем AndroidManifest файле

проверьте эту ссылку

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.xxx.xxxx">

  <application
      android:requestLegacyExternalStorage="true">

  </application>

</manifest>
0 голосов
/ 29 января 2020

Существенно изменились способы доступа к файлам в Android 10

См. https://developer.android.com/training/data-storage

Вам необходимо использовать MediaStore или Storage Access Framework ( SAF), подробности https://developer.android.com/training/data-storage/shared для файлов вне частных каталогов вашего приложения.

Поскольку вы храните фотографию, MediaStore будет способом доступа к изображениям https://developer.android.com/training/data-storage/shared/media

Хотя в качестве быстрого решения стоит временно отказаться от https://developer.android.com/training/data-storage/compatibility, но это будет работать только до Android 11

Некоторые лучшие примеры на https://proandroiddev.com/working-with-scoped-storage-8a7e7cafea3

...