2017-01-08 1 views
0

Я пытаюсь открыть PDF-файлы с внешнего URL-адреса. Код является следующим:Открытие PDF с внешнего URL-адреса говорит «Open File: приложения не могут выполнять это действие»

private void cargaPdf(Uri url){ 
    //File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +"/"+ filename); 
    Intent target = new Intent(Intent.ACTION_VIEW); 
    target.setDataAndType(url,"application/pdf"); 
    target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 

    Intent intent = Intent.createChooser(target, "Open File"); 
    try { 
     startActivity(intent); 
    } catch (ActivityNotFoundException e) { 
     // Instruct the user to install a PDF reader here, or something 
    } 
} 

Я установил Adobe и Google PDF для просмотра, но когда я нажимаю днище, которое вызывает «cargaPdf (Uri URL)» функция с этим URL (как вы можете видеть это PDF-файл) :

Uri.parse(https://dl.dropboxusercontent.com/s/oulzgpgnq2ca1ly/KorfbalSpa.pdf?dl=0); 

Он появляется на экране в испанском «Открыть файл Ninguna aplicacion Puede Realizar ЭСТ acción» или английский «Открыть файл приложение не может выполнить это действие». Что происходит?

Edit 1: Хорошо, теперь я знаю, что я должен загрузить файл, чтобы увидеть его, поэтому я сделал этот код в деятельности:

public void cargaDescripcion(View view){ 
    Log.d("CargaDescripcion", "Antes del directorio"); 
    String extStorageDirectory = Environment.getExternalStorageDirectory() 
      .toString(); 
    File folder = new File(extStorageDirectory, "Mypdf"); 
    folder.mkdir(); 
    File file = new File(folder, "Read.pdf"); 
    try { 
     file.createNewFile(); 
     Log.d("CargaDescripcion", "File creado"); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
    Downloader.DownloadFile(deporte.getUrlDescEs(), file); 
    Log.d("CargaDescripcion", "Despues de descargarlo"); 
    showPdf(); 
    //folder.delete(); 
} 

public void showPdf() 
{ 
    Log.d("showPdf", "Entramos en show pdf"); 
    File file = new File(Environment.getExternalStorageDirectory()+"/Mypdf/Read.pdf"); 
    PackageManager packageManager = getPackageManager(); 
    Intent testIntent = new Intent(Intent.ACTION_VIEW); 
    testIntent.setType("application/pdf"); 
    List list = packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY); 
    Intent intent = new Intent(); 
    intent.setAction(Intent.ACTION_VIEW); 
    Uri uri = Uri.fromFile(file); 
    intent.setDataAndType(uri, "application/pdf"); 
    startActivity(intent); 
    //file.delete(); 
} 

И этот класс для загрузки Ф:

public class Downloader { 
public static void DownloadFile(String fileURL, File directory) { 
    try { 
     FileOutputStream f = new FileOutputStream(directory); 
     URL u = new URL(fileURL); 
     HttpURLConnection c = (HttpURLConnection) u.openConnection(); 
     c.setRequestMethod("GET"); 
     c.setDoOutput(true); 
     c.connect(); 
     InputStream in = c.getInputStream(); 
     byte[] buffer = new byte[1024]; 
     int len1 = 0; 
     while ((len1 = in.read(buffer)) > 0) { 
      f.write(buffer, 0, len1); 
     } 
     f.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

Я получил его отсюда Opening pdf file from server using android intent

Edit 2: Теперь это код, который загрузки и показывает файл:

public void cargaDescripcion(View view){ 
    download(deporte.getUrlDescEs()); 
    showPdf(); 
    //folder.delete(); 
} 

public void download(String url) 
{ 
    new DownloadFile().execute(url, "read.pdf"); 
} 

public void showPdf() 
{ 
    File pdfFile = new File(Environment.getExternalStorageDirectory() + "/Mypdf/" + "read.pdf"); // -> filename = maven.pdf 
    Uri path = Uri.fromFile(pdfFile); 
    Intent pdfIntent = new Intent(Intent.ACTION_VIEW); 
    pdfIntent.setDataAndType(path, "application/pdf"); 
    pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

    try{ 
     startActivity(pdfIntent); 
    }catch(ActivityNotFoundException e){ 
     Toast.makeText(SelectedSportActivity.this, "No Application available to view PDF", Toast.LENGTH_SHORT).show(); 
    } 
} 
private class DownloadFile extends AsyncTask<String, Void, Void> { 

    @Override 
    protected Void doInBackground(String... strings) { 
     String fileUrl = strings[0]; // -> url del archivo 
     String fileName = strings[1]; // -> nombre del archivo.pdf 
     String extStorageDirectory = Environment.getExternalStorageDirectory().toString(); 
     File folder = new File(extStorageDirectory, "Mypdf"); 
     folder.mkdir(); 

     File pdfFile = new File(folder, fileName); 

     try{ 
      pdfFile.createNewFile(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
     Downloader.downloadFile(fileUrl, pdfFile); 
     return null; 
    } 
} 

Однако файловая система не создается с помощью приложения и файл не загружается, прежде чем приложение приходит к следующему пункту, что это это «шоу». Таким образом, файл не существует, когда приложение ищет его.

Edit 3: Чтобы решить эту проблему шоу я использовал onPostExecute метода AsyncTask:

@Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     showPdf(); 
    } 

ответ

6

Используйте этот код, это работает для меня локального файла.

resumePdfFile является путь к файлу, где будет сохранен файл.

private void openPDF(String resumePdfFile) { 
    //file should contain path of pdf file 

    Uri path = Uri.fromFile(resumePdfFile); 
    Log.e("create pdf uri path==>", "" + path); 
    try { 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(path, "application/pdf"); 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(intent); 
     finish(); 
    } catch (ActivityNotFoundException e) { 
     Toast.makeText(getApplicationContext(), 
       "There is no any PDF Viewer", 
       Toast.LENGTH_SHORT).show(); 
     finish(); 
    } 
} 

Вы можете просмотреть или загрузить файлы в формате PDF двумя способами т.е. открыв его в браузере устройства по умолчанию или в WebView, встраивая его в вашем приложении.

Чтобы открыть PDF в браузере,

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(pdf_url)); 
startActivity(browserIntent); 

Чтобы открыть в WebView,

Webview webView = (WebView) findViewById(R.id.webView1); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.loadUrl(pdf_url); 
+0

Его же код, но из файла. – Asier

+0

Да, попробуйте получить uri из файла –

+0

Вы можете просмотреть или загрузить pdf одним из двух способов: i.e, открыв его в браузере устройств по умолчанию или в веб-браузере, вставив его в свое приложение. см. мой отредактированный ответ. –