2015-05-30 10 views
8

Ich möchte eine PDF-Datei öffnen, wenn der Benutzer auf eine Schaltfläche klickt. Derzeit bin ich mit diesem Code, dies zu erreichen:Kann PDF-Datei in externer App nicht öffnen

Uri path = Uri.fromFile(new File("file:///android_asset/regola11_1.pdf")); 
      Intent pdfIntent = new Intent(Intent.ACTION_VIEW); 
      pdfIntent.setDataAndType(path, "application/pdf"); 
      pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(pdfIntent); 

, aber es funktioniert nicht.

Wenn ich wählen Sie den Adobe Acrobat verwenden, erhalte ich eine Nachricht, als Toast angezeigt, die

"This file could not be accessed Check the location or the network and try again." 

sagt Wenn ich mit Drive PDF Viewer versuchen, i

"Cannot display PDF (regola11_1.pdf cannot be opened)" 

Die PDF erhalten Datei wird gespeichert in

app > build > intermediates > assets 

Wo ist das Problem?

EDIT

Jetzt verwende ich den folgenden Code:

File file = new File("\"file:///android_asset/regola11_1.pdf"); 
      Uri path = Uri.fromFile(file); 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setDataAndType(path, "application/pdf"); 
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

      try { 
       context.startActivity(intent); 
      } 
      catch (ActivityNotFoundException e) { 
       Toast.makeText(context, "No application available to view PDF", Toast.LENGTH_LONG).show(); 
      } 

Aber wenn ich versuche, die PDF-Datei zu öffnen, indem Sie auf die Schaltfläche klicken, die App stürzt ab.

ist dies das Protokoll i erhalten:

05-31 10:05:25.132 24474-24474/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.andrey.andreyvedis.iamaref, PID: 24474 
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.content.Context.startActivity(android.content.Intent)' on a null object reference 
     at com.andrey.andreyvedis.iamaref.FragmentR11.onClick(FragmentR11.java:147) 
     at android.view.View.performClick(View.java:4781) 
     at android.view.View$PerformClick.run(View.java:19873) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5293) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 

Das ist meine Klasse:

public class FragmentR11 extends Fragment implements View.OnClickListener{ 
// TODO: Rename parameter arguments, choose names that match 
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 
Context context; 



// TODO: Rename and change types of parameters 
private String mParam1; 
private String mParam2; 


/** 
* Use this factory method to create a new instance of 
* this fragment using the provided parameters. 
* 
* @param param1 Parameter 1. 
* @param param2 Parameter 2. 
* @return A new instance of fragment FragmentR11. 
*/ 
// TODO: Rename and change types and number of parameters 
public static FragmentR11 newInstance(String param1, String param2) { 
    FragmentR11 fragment = new FragmentR11(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

public FragmentR11() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 
     mParam1 = getArguments().getString(ARG_PARAM1); 
     mParam2 = getArguments().getString(ARG_PARAM2); 
    } 



} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_r11, container, false); 


} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    getActivity().findViewById(R.id.bD1).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD2).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD3).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD4).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD5).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD6).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD7).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD8).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD9).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD10).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD11).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD12).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD13).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD14).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD15).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD16).setOnClickListener(this); 
    getActivity().findViewById(R.id.bD17).setOnClickListener(this); 


} 

/**private void openPDF(final String pathToPDF) { 
    File file = new File(pathToPDF); 
    Uri path = Uri.fromFile(file); 
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent.setDataAndType(path, "application/pdf"); 
    try { 
     startActivity(intent); 
    } catch (ActivityNotFoundException e) { 
     Toast.makeText(getActivity(), "Devi installare un'app per aprire PDF, come Adobe Acrobat Reader ", Toast.LENGTH_SHORT).show(); 
    } 
}*/ 


@Override 
public void onClick(View v) { 



    switch(v.getId()){ 

     case R.id.bD1: { 

      /**Uri path = Uri.fromFile(new File("regola11_1.pdf")); 
      Intent pdfIntent = new Intent(Intent.ACTION_VIEW); 
      pdfIntent.setDataAndType(path, "application/pdf"); 
      pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(pdfIntent); 
      Toast.makeText(getActivity(), "Hai cliccato Regola 1 in Reg11 ", Toast.LENGTH_SHORT).show();*/ 

      File file = new File("\"file:///android_asset/regola11_1.pdf"); 
      Uri path = Uri.fromFile(file); 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setDataAndType(path, "application/pdf"); 
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

      try { 
       context.startActivity(intent); 
      } 
      catch (ActivityNotFoundException e) { 
       Toast.makeText(context, "No application available to view PDF", Toast.LENGTH_LONG).show(); 
      } 
      break; 
     } 

     case R.id.bD2: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 2 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 


     case R.id.bD3: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 3 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD4: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 4 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD5: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 5 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD6: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 6 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD7: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 7 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD8: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 8 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD9: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 9 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD10: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 10 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD11: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 11 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD12: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 12 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD13: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 13 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD14: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 14 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD15: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 15 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD16: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 16 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 

     case R.id.bD17: 

     { 
      Toast.makeText(getActivity(), "Hai cliccato Regola 17 in Reg11 ", Toast.LENGTH_SHORT).show(); 

      break; 
     } 


    } 

} 

}

Kann mir jemand helfen?

EDIT 2

ich die Lösung gefunden haben, überprüfen Sie meine Antwort unten für den Code.

Vielen Dank für Ihre Antworten.

Antwort

7

Ok Jungs, Problem gelöst!

Dies ist der Code, den ich verwende, um eine PDF-Datei auf externen Speichern gespeichert zu öffnen:

File pdfFile = new File(Environment.getExternalStorageDirectory(),"namePdfFile.pdf");//File path 
      if (pdfFile.exists()) //Checking for the file is exist or not 
      { 
       Uri path = Uri.fromFile(pdfFile); 
       Intent objIntent = new Intent(Intent.ACTION_VIEW); 
       objIntent.setDataAndType(path, "application/pdf"); 
       objIntent.setFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(objIntent);//Staring the pdf viewer 
      } else { 

       Toast.makeText(getActivity(), "The file not exists! ", Toast.LENGTH_SHORT).show(); 

      } 
3

Drittanbieter-Apps können über file:///android_asset URLs nicht auf Ihre Assets zugreifen.

Sie können:

  • Versuchen my StreamProvider mit einem ContentProvider in Ihrer App zu haben, die die PDF direkt aus Vermögenswerten dienen können, oder

  • Verwenden FileProvider aus dem Android-Support-Paket, nach dem Kopieren die Datei von Assets zum internen Speicher, wie in this sample app oder

  • gezeigt wird Kopieren Sie die Datei auf externen Speicher und verwenden Sie eine Uri von Uri.fromFile() erstellt auf diese Kopie Punkt

+0

Sorry, aber ich bin ein Anfänger, und ich weiß nicht, wie https: // github.com/commonsguy/cwac-provider. Können Sie mir bitte Schritt für Schritt Anweisungen geben? –

+0

@AndreyVdishchev: Wenn Sie Anfänger sind, würde ich empfehlen, dass Sie mit der dritten Kugel in meiner Antwort gehen. – CommonsWare

+0

Ok, aber wie geht das? –

1

Diese Berechtigung hinzufügen und erneut prüfen:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

es scheint, gibt es ein Problem mit auf die Datei zugreifen.

Versuchen Sie, eine andere PDF-Datei zu öffnen und lassen Sie uns wissen, was das Protokoll ist.

und auch ich glaube, Sie nicht verwenden können: file:///android_asset

und einen Blick auf diese:

Wählen Sie die Datei mit ExternalStorageDirectory:

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

Intent intent = Intent.createChooser(target, "Open File"); 

Von:https://stackoverflow.com/a/17453242/4945820

Mit Assets Ordner:

und hier ist der Code, wenn Sie diese mit Assets Ordner verwenden!

File file = new File("file:///android_asset/example.pdf"); 
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(file), "application/pdf"); 
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent); 

und dann über die Erlaubnis hinzufügen und überprüfen Sie erneut mit dem Code Assets. Überprüfen Sie auch dies: https://stackoverflow.com/q/28032029/4945820

+0

Ich habe meinen Code mit Ihrem ersetzt und fügte die oben genannten Berechtigungen hinzu. Leider, wenn ich "+ Dateiname" mit dem Namen einer PDF-Datei, zum Beispiel "regola11_2.pdf", ersetze, ist es rot gefärbt und ich bekomme ein "Kann nicht auflösen Symbol 'regola11_2.pdf'". Kannst du mir sagen, was ich falsch gemacht habe? –

+0

Bearbeiten und Aktualisiert.Sie ​​sollten den zweiten Teil der Codes verwenden (mit Assets) – developerdroid

+0

Nichts ... Es gibt immer noch die gleichen Nachrichten ... –

2

Einstelldaten als "file:///" + filePath für mich gearbeitet.

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(filePath)); 
intent.setDataAndType(Uri.parse("file:///" + filePath), "application/pdf"); 
context.startActivity(intent); 
0

hatte ich das gleiche Problem, nach Stunden Umgang mit dem Problem erkennen ich, dass ich „/“ zwischen dem Dateipfad und den Dateinamen hinzuzufügen verpaßt.

Also die Datei wurde nicht gefunden und ich habe "Diese Datei konnte nicht zugegriffen werden Überprüfen Sie den Standort oder das Netzwerk und versuchen Sie es erneut." Botschaft.

Hoffnung dieser Hilfe jemand;)

0

Mein Problem nach dem Hinzufügen dieser Berechtigung behoben ist :)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />