Открыть файл при уведомлении, нажмите загруженный с помощью Retrofit2 - PullRequest
0 голосов
/ 06 марта 2019

Я загружаю PDF, используя модифицированный веб-сервис. И затем я показываю самостоятельно созданное уведомление, чтобы показать, что файл был загружен. Но я не могу понять, как показать или открыть файл при нажатии на уведомление.

Вот мой звонок-уведомление:

RestClient.webServices()
        .downloadFile(id)
        .enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

                if (response.isSuccessful()) {

                    boolean writtenToDisk = writeResponseBodyToDisk(response.body());

                    Log.e(TAG, "file download was a success? " + writtenToDisk);

                    if (writtenToDisk) {

                        showToast("Invoice downloaded successfully");
                        showDownloadNotification();

                    }
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {

            }
        });

Вот функция writeResponseBodyToDisk ():

private boolean writeResponseBodyToDisk(ResponseBody body) {
    try {
        // todo change the file location/name according to your needs
        File futureStudioIconFile = new File(Environment.getExternalStorageDirectory() + File.separator + "/bill.pdf");

        InputStream inputStream = null;
        OutputStream outputStream = null;

        try {
            byte[] fileReader = new byte[4096];

            long fileSize = body.contentLength();
            long fileSizeDownloaded = 0;

            inputStream = body.byteStream();
            outputStream = new FileOutputStream(futureStudioIconFile);

            while (true) {
                int read = inputStream.read(fileReader);

                if (read == -1) {
                    break;
                }

                outputStream.write(fileReader, 0, read);

                fileSizeDownloaded += read;

                // Log.d(TAG, "file download: " + fileSizeDownloaded + " of " + fileSize);
            }

            outputStream.flush();

            return true;
        } catch (IOException e) {
            return false;
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }

            if (outputStream != null) {
                outputStream.close();
            }
        }
    } catch (IOException e) {
        return false;
    }
}

А вот функция showDownloadNotification ():

void showDownloadNotification() {
    try {
        Uri selectedUri = Uri.parse(Environment.getExternalStorageDirectory() + File.separator + "/invoice.pdf");
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(selectedUri, "resource/folder");
        //            startActivity(intent);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);


        NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_logo_winds)
                .setContentTitle("Invoice downloaded")
                .setContentText("")
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);

        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

        // notificationId is a unique int for each notification that you must define
        notificationManager.notify(1, builder.build());

    } catch (Exception e) {
        Log.e(TAG, "Notification " + e.toString());
    }
}

Поэтому, когда я нажимаю на созданное уведомление, ничего не происходит, и когда я раскомментирую startActivity (намерение); он падает, говоря, что не может найти активность для намерения. Как открыть загруженный файл, щелкнув созданное для него уведомление?

1 Ответ

0 голосов
/ 08 марта 2019

Похоже, вы передаете неправильный тип данных намерению в методе showDownloadNotification().Вот как вы можете открыть PDF:

Uri selectedUri = Uri.parse(Environment.getExternalStorageDirectory() + File.separator + "/invoice.pdf");

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(selectedUri, "application/pdf"); // here we set correct type for PDF
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

...