открыть pdf после загрузки

Я использую этот код для загрузки pdf

downloadManager = (DownloadManager) 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.setTitle("story" + name);
                                        request.setDescription("download " + name);
                                        request.setDestinationInExternalFilesDir(R_arabic.this,"/Rewayat/", name+".pdf");
                                        Long reference = downloadManager.enqueue(request);

it work good and pdf download in app folder in android / data

и я использую этот код, чтобы открыть pdf

File file = new File ("/data/com.kamal.ahmed.rewaya/files/Rewayat/"+name+".pdf");
Intent target = new Intent (Intent.ACTION_VIEW);
target.setDataAndType(Uri.fromFile(file),"application/pdf");
target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

Intent intent = Intent.createchosser(target, "Open File");
try {
    startActivity(intent);
} catch (ActivityNotFoundException e) {
}

но когда я пытаюсь открыть его, я не получаю правильный pdf-файл и получаю файл ошибки
я думаю путь не прав пожалуйста помогите мне

1 ответ

  1. Загрузка документа во внешнее хранилище

    DownloadManager.Request r = new DownloadManager.Request(Uri.parse(document_url));
    
    // This puts the downloaded document in the Download directory
    r.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "my_document.pdf");  
    r.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);        
    DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    dm.enqueue(r);
    

    Код для открытия

    public void OpenPDF() {
        try {
            File file = new File(Environment.getExternalStorageDirectory()
                    + "/Download/" + "my_document.pdf");
            if (!file.isDirectory())
                file.mkdir();
            Intent pdfIntent = new Intent("com.adobe.reader");
            pdfIntent.setType("application/pdf");
            pdfIntent.setAction(Intent.ACTION_VIEW);
            Uri uri = Uri.fromFile(file);
            pdfIntent.setDataAndType(uri, "application/pdf");
            startActivity(pdfIntent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    Вам нужно разрешение на запись внешнего хранилища, проверьте, как получить разрешение в новой версии android (вы должны запросить разрешение с помощью кода, а не только в манифесте)

    Чтобы запросить разрешение у пользователя для записи внешнего хранилища, поместите эти два метода в основное действие

    public  boolean isStoragePermissionGranted() {
            if (Build.VERSION.SDK_INT >= 23) {
                if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        == PackageManager.PERMISSION_GRANTED) {
                    Log.v("PERMISSIONS", "Permission is granted");
                    return true;
                } else {
    
                    Log.v("PERMISSIONS","Permission is revoked");
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                    return false;
                }
            }
            else { //permission is automatically granted on sdk<23 upon installation
                Log.v("PERMISSIONS","Permission is granted");
                return true;
            }
    
    
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
                Log.v("PERMISSIONS","Permission: "+permissions[0]+ "was "+grantResults[0]);
                //resume tasks needing this permission
            }
        }
    

    и внутри onCreate, вызовите метод

    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // ...
            isStoragePermissionGranted();
    

    Внутри манифеста.xml перед <application>тегом поместите эти два разрешения

    <uses-permission android_name="android.permission.INTERNET" />
    <uses-permission android_name="android.permission.WRITE_EXTERNAL_STORAGE"/>