2013-07-03 21 views
22

Pracuję nad aplikacją na Androida i muszę otworzyć kilka plików.Android otwarty plik pdf

To jest mój kod za pomocą intencji:

public class FacturaActivity extends Activity { 

    (...) 

    public void downloadInvoice(View view) { 
     File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +"/"+ filename); 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(Uri.fromFile(file),"application/pdf"); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
     startActivity(intent); 
    } 
} 

Plik znajduje się w katalogu głównym karty SD i mogę go otworzyć ręcznie.

problem

aplikacji jest zamknięty, gdy dotrze do startActivity (intent). Myślę, że problem dotyczy pliku AndroidManifest.xml, ale nie wiem, jak go poprawnie umieścić.

AndroidManifest.xml

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

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="8" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
    android:name="###.MyApplication" > <!--cant show complete name--> 
    <activity 
     android:name="###.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <activity 
     android:name=".FacturaActivity" > 
    </activity> 

</application> 

LogCat

07-03 15:49:13.094: E/AndroidRuntime(1032): FATAL EXCEPTION: main 
07-03 15:49:13.094: E/AndroidRuntime(1032): java.lang.IllegalStateException: Could not execute method of the activity 
(...) 
07-03 15:49:13.094: E/AndroidRuntime(1032): Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///mnt/sdcard/201209_F2012212782.PDF typ=application/pdf flg=0x40000000 } 
07-03 15:49:13.094: E/AndroidRuntime(1032):  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1408) 
07-03 15:49:13.094: E/AndroidRuntime(1032):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378) 
07-03 15:49:13.094: E/AndroidRuntime(1032):  at android.app.Activity.startActivityForResult(Activity.java:2817) 
07-03 15:49:13.094: E/AndroidRuntime(1032):  at android.app.Activity.startActivity(Activity.java:2923) 

Pomożesz mi, aby zakończyć AndroidManifest? Lub jak mogę otworzyć ten plik pdf?

+0

wydaje Android ma aplikację zainstalowaną dowolny czytnik PDF, dodać jedną –

+0

mogę otworzyć plików innych pdf z ThinkFree PDF Viewer. – Lyd

+0

Ten post na blogu pomaga, jeśli próbujesz użyć 'ContentProvider' (co jest teraz zalecane): http://www.blogc.at/2014/03/23/share-private-files-with-other-apps- fileprovider/ – Sakiboy

Odpowiedz

69

Problem polega na tym, że nie ma zainstalowanej aplikacji do obsługi otwierania pliku PDF. Należy użyć zamiarem Chooser, tak:

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"); 
try { 
    startActivity(intent); 
} catch (ActivityNotFoundException e) { 
    // Instruct the user to install a PDF reader here, or something 
} 
+0

Próbowałem go w moim telefonie komórkowym. Kiedy otwieram pdf innej aplikacji, mówi się o zarejestrowaniu ThinkFree, mówię "Później" i "ThinkFree PDF Viewer Mobile dla Androida" jest otwarty, pokazując mi plik PDF. Z twoim kodem przychodzi tylko poprosić o rejestrację ThinkFree. Jeśli powiem "później", to się zamknie. – Lyd

+1

To nie ma nic wspólnego z tym kodem. Nie można kontrolować sposobu, w jaki ThinkFree obsługuje to intencje. Spróbuj zainstalować alternatywną przeglądarkę plików PDF. –

+0

Dzięki, jest w porządku. Jeszcze jedno ... Kiedy zamykam plik pdf (z przyciskiem "Wstecz" telefonu), moja aplikacja kończy się błędem. Jak mogę to rozwiązać? – Lyd

5
String dir="/Attendancesystem"; 

public void displaypdf() { 

     File file = null; 
      file = new File(Environment.getExternalStorageDirectory()+dir+ "/sample.pdf"); 
     Toast.makeText(getApplicationContext(), file.toString() , Toast.LENGTH_LONG).show(); 
     if(file.exists()) { 
      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"); 
      try { 
       startActivity(intent); 
      } catch (ActivityNotFoundException e) { 
       // Instruct the user to install a PDF reader here, or something 
      } 
     } 
     else 
      Toast.makeText(getApplicationContext(), "File path is incorrect." , Toast.LENGTH_LONG).show(); 
    } 
+0

Użyj powyższego kodu, gdy plik jest przechowywany w pamięci wewnętrznej. –