Как создать пользовательский каталог во внутреннем хранилище, чтобы сохранить загруженный файл? - PullRequest
0 голосов
/ 14 января 2019

Я работаю с Firebase для приложения. Я вручную загрузил файл PDF в хранилище Firebase, чтобы пользователи могли загрузить его с помощью приложения. Загруженные файлы сохраняются в Android -> data -> FileName -> directory -> file . Но мне нужен собственный каталог для сохранения файлов прямо во внутреннем хранилище.

   public void downloadFile(){
        str = FirebaseStorage.getInstance().getReference();
        final File mydir = this.getDir("mydir", Context.MODE_PRIVATE); //Creating an internal dir;

    ref = str.child("AI (presentation).pptx");
        ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                String url = uri.toString();
                downloadFiles(MainActivity.this,"AI",".ppt",mydir ,url);
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {

            }
        });
}

public void downloadFiles(Context context, String fileName, String fileExtension, File destinationDirectory, String url) {

    DownloadManager downloadmanager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
    Uri uri = Uri.parse(url);
    DownloadManager.Request request = new DownloadManager.Request(uri);

    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    request.setDestinationInExternalFilesDir(context, "" + destinationDirectory, fileName + fileExtension);

    downloadmanager.enqueue(request);
}

1 Ответ

0 голосов
/ 14 января 2019

Вам не нужно использовать DownloadManager. Вместо этого вы можете использовать StorageReferenece.getBytes () и сохранить файл вручную.

    private static final long DOWNLOAD_LIMIT = 1024 * 1024; // you can change this

    public void downloadFile(){
        StorageReference ref = FirebaseStorage.getInstance().getReference("AI (presentation).pptx");
        ref.getBytes(DOWNLOAD_LIMIT).addOnSuccessListener(new OnSuccessListener<byte[]>() 
        {
            @Override
            public void onSuccess(byte[] bytes) {
                final String path = Environment.getExternalStorageDirectory().getAbsolutePath()
                    + "/mydir/AI (presentation).pptx";
                try {
                    writeToFile(bytes, path);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                Log.e(TAG, "fail to download: " + exception);
            }
        });
    }

    public void writeToFile(byte[] data, String fileName) throws IOException{
        FileOutputStream out = new FileOutputStream(fileName);
        out.write(data);
        out.close();
    }
...