2015-03-11 13 views
14

Voglio selezionare solo il file pdf, xlsx e txt dalla memoria ma intent.setType può fare solo un file (solo file .txt (o) solo file pdf). È possibile ottenere tutti e tre i file codificando intent.setType() e c'è un modo per farlo?come rendere intent.setType per file pdf, xlsx e txt android?

Ecco alcuni dei miei codici.

private void showFileChooser() { 
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("application/pdf"); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 

    try { 
     startActivityForResult(
       Intent.createChooser(intent, "Select txt file"), 
       0); 
    } catch (android.content.ActivityNotFoundException ex) { 
     // Potentially direct the user to the Market with a Dialog 

    } 
} 
+0

si dovrebbe guardare a http://stackoverflow.com/a/33117677/5597641 –

+0

Eventuali duplicati di [come scegliere alcuni tipi di file via intent in android?] (http://stackoverflow.com/questions/33117592/how-to-pick-few-type-of-file-via-intent-in-android) –

risposta

1

È possibile utilizzare Intent.ACTION_OPEN_DOCUMENT,

Ogni documento è rappresentato come un contenuto: // URI sostenuta da un DocumentsProvider, che può essere aperto come un ruscello con openFileDescriptor(Uri, String), o interrogato per DocumentsContract.Document metadati.

Tutti i documenti selezionati vengono restituiti all'applicazione chiamante con autorizzazioni di lettura e scrittura persistenti. Se si desidera mantenere l'accesso ai documenti attraverso i riavvii del dispositivo, è necessario prendere esplicitamente le autorizzazioni persistenti utilizzando takePersistableUriPermission(Uri, int).

I chiamanti devono indicare i tipi di documenti MIME accettabili tramite setType(String). Ad esempio, per selezionare le foto, utilizzare image/*. Se sono accettabili più tipi MIME disgiunti, definirli in EXTRA_MIME_TYPES e setType(String) in */*.

Per gli ulteriori dettagli, consultare questo link

http://developer.android.com/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT

Si noti che questo è disponibile solo sul livello di API 19+.

4

Sembra che tu voglia solo vedere se questi intenti possono essere risolti. Questo potrebbe essere un approccio migliore:

private void showFileChooser() { 

    Intent intentPDF = new Intent(Intent.ACTION_GET_CONTENT); 
    intentPDF.setType("application/pdf"); 
    intentPDF.addCategory(Intent.CATEGORY_OPENABLE); 

    Intent intentTxt = new Intent(Intent.ACTION_GET_CONTENT); 
    intentTxt.setType("text/plain"); 
    intentTxt.addCategory(Intent.CATEGORY_OPENABLE); 

    Intent intentXls = new Intent(Intent.ACTION_GET_CONTENT); 
    intentXls.setType("application/x-excel"); 
    intentXls.addCategory(Intent.CATEGORY_OPENABLE); 

    PackageManager packageManager = getPackageManager(); 

    List activitiesPDF = packageManager.queryIntentActivities(intentPDF, 
    PackageManager.MATCH_DEFAULT_ONLY); 
    boolean isIntentSafePDF = activitiesPDF.size() > 0; 

    List activitiesTxt = packageManager.queryIntentActivities(intentTxt, 
    PackageManager.MATCH_DEFAULT_ONLY); 
    boolean isIntentSafeTxt = activitiesTxt.size() > 0; 

    List activitiesXls = packageManager.queryIntentActivities(intentXls, 
    PackageManager.MATCH_DEFAULT_ONLY); 
    boolean isIntentSafeXls = activitiesXls.size() > 0; 

    if (!isIntentSafePDF || !isIntentSafeTxt || !isIntentSafeXls){ 

     // Potentially direct the user to the Market with a Dialog 

    } 

} 

Riferimenti:

http://developer.android.com/training/basics/intents/sending.html

How do I determine if Android can handle PDF

1

Si consiglia di utilizzare la funzione di sistema per trovare le mimeType specifiche del file che si sta tentando di accesso (come "application/pdf"). Se hai a che fare con un tipo sconosciuto, probabilmente sarà difficile trovare il tipo. Spero che questo codice ti salverà!

String url=Environment.getExternalStorageDirectory().getAbsolutePath()+"/Saves/contacts.vcf"; 
File file = new File(url); 
Intent intent = new Intent(Intent.ACTION_VIEW); 
String mimeType=MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url)); 
intent.setDataAndType(Uri.fromFile(file), mimeType); 
Intent intent1 = Intent.createChooser(intent, "Open With"); 
startActivity(intent1); 

Fonte HERE

10
intent.setType("image/*|application/pdf|audio/*"); 

forse questo è ciò che si desidera.

1

È necessario controllare questo collegamento http://www.androidsnippets.com/open-any-type-of-file-with-default-intent.html. Leggi anche il tipo Mime.

Ecco come ho implementato per qualsiasi file o selezionati tipo mime di file

String[] mimeTypes = 
{"image/*","application/pdf","application/msword","application/vnd.ms-powerpoint","application/vnd.ms-excel","text/plain"}; 

         Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
         intent.addCategory(Intent.CATEGORY_OPENABLE); 

         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
          intent.setType(mimeTypes.length == 1 ? mimeTypes[0] : "*/*"); 
          if (mimeTypes.length > 0) { 
           intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes); 
          } 
         } else { 
          String mimeTypesStr = ""; 
          for (String mimeType : mimeTypes) { 
           mimeTypesStr += mimeType + "|"; 
          } 
          intent.setType(mimeTypesStr.substring(0,mimeTypesStr.length() - 1)); 
         } 
         startActivityForResult(Intent.createChooser(intent,"ChooseFile"), 0); 
17

modo di @Fatehali Asamadi è OK, ma hanno bisogno di aggiungere qualcosa per un uso appropriato. Per i documenti Microsoft vengono utilizzate sia estensioni (.doc o .docx), (.ppt o .pptx), (.xls o .xlsx). Per supportare o sfogliare queste estensioni è necessario aggiungere altri mymeTypes.

Utilizzare il seguente metodo per cercare documenti in cui REQUEST_CODE_DOC è requestCode per onActivityResult (final int requestCode, final int resultCode, final Intent data) @Override method.

private void browseDocuments(){ 

    String[] mimeTypes = 
      {"application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .doc & .docx 
        "application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation", // .ppt & .pptx 
        "application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // .xls & .xlsx 
        "text/plain", 
        "application/pdf", 
        "application/zip"}; 

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     intent.setType(mimeTypes.length == 1 ? mimeTypes[0] : "*/*"); 
     if (mimeTypes.length > 0) { 
      intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes); 
     } 
    } else { 
     String mimeTypesStr = ""; 
     for (String mimeType : mimeTypes) { 
      mimeTypesStr += mimeType + "|"; 
     } 
     intent.setType(mimeTypesStr.substring(0,mimeTypesStr.length() - 1)); 
    } 
    startActivityForResult(Intent.createChooser(intent,"ChooseFile"), REQUEST_CODE_DOC); 

} 

È possibile ottenere concetto chiaro e aggiungi le mymeTypes richiesti dal Here