Ich möchte eine PDF -Datei öffnen, wenn der Benutzer auf eine Schaltfläche klickt. Derzeit verwende ich diesen Code, um dies zu erreichen:
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 geht nicht.
Wenn ich Adobe Acrobat verwende, erhalte ich eine Meldung, die als Toast angezeigt wird
"This file could not be accessed Check the location or the network and try again."
Wenn ich es mit Drive PDF Viewer versuche, bekomme ich es
"Cannot display PDF ( regola11_1.pdf cannot be opened)"
Die Datei PDF wird in gespeichert
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();
}
Wenn ich jedoch versuche, das PDF durch Klicken auf die Schaltfläche zu öffnen, stürzt die App ab.
Dies ist das Log, das ich bekomme:
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 habe die Lösung gefunden. Überprüfen Sie meine Antwort unten auf den Code.
Vielen Dank für Ihre Antworten.
Ok Jungs, Problem gelöst!
Dies ist der Code, den ich zum Öffnen einer PDF -Datei verwende, die im externen Speicher gespeichert ist:
File pdfFile = new File(Environment.getExternalStorageDirectory(),"namePdfFile.pdf");//File path
if (pdfFile.exists()) //Checking if the file exists 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);//Starting the pdf viewer
} else {
Toast.makeText(getActivity(), "The file not exists! ", Toast.LENGTH_SHORT).show();
}
Apps von Drittanbietern können nicht über file:///Android_asset
-URLs auf Ihre Assets zugreifen.
Sie können:
Verwenden Sie meine StreamProvider
, um eine ContentProvider
in Ihrer App zu haben, die das PDF direkt aus Assets bedienen kann, oder
Verwenden Sie FileProvider
aus dem Android Support-Paket, nachdem Sie die Datei von Assets in den internen Speicher kopiert haben, wie in dieser Beispiel-App oder gezeigt
Kopieren Sie die Datei in einen externen Speicher und verwenden Sie eine Uri
, die aus Uri.fromFile()
erstellt wurde, um auf diese Kopie zu verweisen
Das Einstellen der Daten als "file:///" + filePath
hat für mich geklappt.
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(filePath));
intent.setDataAndType(Uri.parse("file:///" + filePath), "application/pdf");
context.startActivity(intent);
Fügen Sie diese Berechtigung hinzu und prüfen Sie erneut:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
anscheinend gibt es ein Problem beim Zugriff auf die Datei.
Versuchen Sie, eine weitere PDF-Datei zu öffnen, und lassen Sie uns wissen, was das Protokoll ist.
und ich denke, Sie können dies nicht verwenden: file:///Android_asset
und schau dir das an:
Wähle 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 dies mit Assets
Folder 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 fügen Sie dann die obige Berechtigung hinzu und überprüfen Sie sie erneut mit dem Assets-Code. Überprüfen Sie auch Folgendes: https://stackoverflow.com/q/28032029/4945820
Der Fehler tritt auf, weil die PDF-Datei jedes Mal erneut heruntergeladen wird. Da das Herunterladen jedoch nicht in dieser begrenzten Zeitspanne abgeschlossen werden kann, wird ein ungültiger Formatfehler angezeigt, und die Datei-ID befindet sich noch immer im Status des Herunterladens.
Searchedtext = text.getText().toString();
File file = new File(Environment.getExternalStorageDirectory() + "/pdf", Searchedtext + ".pdf");
if (file.exists()) {
showPdf();
}
else {
download();
showPdf();
}
Mein Problem ist gelöst, nachdem Sie diese Berechtigung hinzugefügt haben :)
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
Ich hatte das gleiche Problem, als ich stundenlang mit dem Problem umgegangen war, stellte ich fest, dass ich es versäumt habe, "/" zwischen Dateipfad und Dateiname hinzuzufügen.
Die Datei wurde nicht gefunden und ich habe "Diese Datei konnte nicht aufgerufen werden. Überprüfen Sie den Speicherort oder das Netzwerk und versuchen Sie es erneut." Botschaft.
Hoffe das hilft jemandem;)