AndroidStudio getExternalStoragePublicDirectory в API 29 - PullRequest
1 голос
/ 11 ноября 2019

В API 29 метод getExternalStoragePublicDirectory устарел, поэтому мне нужно найти способ преобразовать следующий код в API 29

String pathSave = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                            + new StringBuilder("/GroupProjectRecord_")
                            .append(new SimpleDateFormat("dd-MM-yyyy-hh_mm_ss")
                            .format(new Date())).append(".3gp").toString(); 

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

В API 29 и выше выполнение каких-либо действий с путями вне частного хранилища приложений не будет работать.

Подробнее см. https://developer.android.com/training/data-storage/files/external-scoped

Поэтому для сохранения необходимосделать что-то вроде: -


    // OnClick Save Button
    public void Save(View view){

        // Ask for a new filename
        Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
        // Restrict to openable items
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        // Set mimeType
        intent.setType("text/plain");
        // Suggest a filename
        intent.putExtra(Intent.EXTRA_TITLE, "text.txt");
        // Start SAF file chooser
        startActivityForResult(intent, 1);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent resultData) {
        super.onActivityResult(requestCode, resultCode, resultData);

        if (requestCode == 1 && resultCode == RESULT_OK) {
            Log.d("SAF", "Result code 1");
            if (resultData != null) {
                Uri uri = resultData.getData();
                Log.d("SAF", uri.toString());

                // Now write the file
                try {
                    ParcelFileDescriptor pfd =
                            this.getContentResolver().
                                    openFileDescriptor(uri, "w");

                    // Get a Java FileDescriptor to pass to Java IO operations
                    FileDescriptor fileDescriptor = pfd.getFileDescriptor();

                    // Read Input stream
                    FileOutputStream fileOutputStream =
                            new FileOutputStream(fileDescriptor);

                    // .....

                } catch (Exception e){
                    // Do something with Exceptions
                }
            } else {
                Log.d("SAF", "No Result");
            }
        }
    }

0 голосов
/ 11 ноября 2019

Как уже упоминалось в документации для Android

Приложения могут продолжать получать доступ к содержимому, хранящемуся в общем / внешнем хранилище, путем миграции на альтернативы, такие как Context # getExternalFilesDir (String)

Попробуйте использовать этот метод.

public void getFilePath(Context context){
        String path = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
                + new StringBuilder("/GroupProjectRecord_")
                .append(new SimpleDateFormat("dd-MM-yyyy-hh_mm_ss")
                        .format(new Date())).append(".3gp").toString();

        Log.d(TAG, "getFilePath: "+path);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...