2013-10-17 11 views
13

Sto lavorando a un'applicazione Android che dovrebbe essere in grado di aprire un file selezionato da una cartella specifica.Aprire un file selezionato (immagine, pdf, ...) a livello di programmazione dalla mia applicazione Android?

Ho già provato questo, ma dopo selezione che voglio aprire l'applicazione, ho ricevuto questo messaggio:

Impossible carico

Dopo aver provato un sacco di thread 1 e thread 2, io uso queste linee di codice per farlo:

Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.parse("/mnt/sdcard/xxx/xxx/Pictures/xxx.jpg"), "image/*"); 
myContext.startActivity(intent); 

Come posso capire questo?

+0

Questo è un metodo semplice ed effettuando: http://indyvision.net/ 2010/03/android-using-intents-open-files/ –

risposta

22

Prova il codice qui sotto. Sto usando questo codice per aprire un file PDF. Puoi usarlo anche per altri file.

File file = new File(Environment.getExternalStorageDirectory(), 
        "Report.pdf"); 
Uri path = Uri.fromFile(file); 
Intent pdfOpenintent = new Intent(Intent.ACTION_VIEW); 
pdfOpenintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
pdfOpenintent.setDataAndType(path, "application/pdf"); 
try { 
    startActivity(pdfOpenintent); 
} 
catch (ActivityNotFoundException e) { 

} 

Se si desidera aprire i file, è possibile modificare la setDataAndType(path, "application/pdf"). Se vuoi aprire file diversi con lo stesso intento, puoi usare Intent.createChooser(intent, "Open in...");. Per ulteriori informazioni, consultare How to make an intent with multiple actions.

+1

Grazie a @Ameer per la risposta. È davvero utile Quindi per gestire tutti i tipi di file, sostituisco ** "application/pdf" ** con _ "*/*" _. – 13KZ

3

Prova this link. Potrebbe aiutarti.

Il link contiene:

esempio per mostrare come creare un selettore di immagine.

public class MainActivity extends Activity { 
    private Uri mImageCaptureUri; 
    private ImageView mImageView; 

    private static final int PICK_FROM_CAMERA = 1; 
    private static final int PICK_FROM_FILE = 2; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     final String [] items  = new String [] {"From Camera", "From SD Card"}; 
     ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, android.R.layout.select_dialog_item, items); 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 

     builder.setTitle("Select Image"); 
     builder.setAdapter(adapter, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int item) { 
       if (item == 0) { 
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
        File file  = new File(Environment.getExternalStorageDirectory(), 
             "tmp_avatar_" + String.valueOf(System.currentTimeMillis()) + ".jpg"); 
        mImageCaptureUri = Uri.fromFile(file); 

        try { 
         intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri); 
         intent.putExtra("return-data", true); 

         startActivityForResult(intent, PICK_FROM_CAMERA); 
        } 
        catch (Exception e) { 
         e.printStackTrace(); 
        } 

        dialog.cancel(); 
       } 
       else { 
        Intent intent = new Intent(); 

        intent.setType("image/*"); 
        intent.setAction(Intent.ACTION_GET_CONTENT); 

        startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_FILE); 
       } 
      } 
     }); 

     final AlertDialog dialog = builder.create(); 

     mImageView = (ImageView) findViewById(R.id.iv_pic); 

     ((Button) findViewById(R.id.btn_choose)).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       dialog.show(); 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     if (resultCode != RESULT_OK) 
      return; 

     Bitmap bitmap = null; 
     String path  = ""; 

     if (requestCode == PICK_FROM_FILE) { 
      mImageCaptureUri = data.getData(); 
      path = getRealPathFromURI(mImageCaptureUri); // From Gallery 

      if (path == null) 
       path = mImageCaptureUri.getPath(); // From File Manager 

      if (path != null) 
       bitmap = BitmapFactory.decodeFile(path); 
     } 
     else { 
      path = mImageCaptureUri.getPath(); 
      bitmap = BitmapFactory.decodeFile(path); 
     } 

     mImageView.setImageBitmap(bitmap); 
    } 

    public String getRealPathFromURI(Uri contentUri) { 
     String [] proj  = {MediaStore.Images.Media.DATA}; 
     Cursor cursor  = managedQuery(contentUri, proj, null, null,null); 

     if (cursor == null) 
      return null; 

     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 

     cursor.moveToFirst(); 

     return cursor.getString(column_index); 
    } 
} 

Il codice dal mio progetto di esempio sopra mostra come creare una finestra di dialogo che mostra due opzioni per selezionare la sorgente di immagini. Il primo è da Camera, dove l'immagine è presa direttamente dalla fotocamera, e il secondo è da immagini salvate su sdcard.

riga 14: Definire due opzioni di origine immagine, dalla fotocamera e dalla scheda SD.

riga 16-48: Impostare la finestra di dialogo di selezione immagine.

riga 22: Se l'utente sceglie di scattare una foto dalla fotocamera, creare l'intenzione di aprire l'app della videocamera con l'azione MediaStore.ACTION_IMAGE_CAPTURE.

riga 23: Creare un file temporaneo per mantenere l'immagine dalla telecamera.

linea 24: Ottenere l'URI del file temporaneo

linea 39: Se l'utente sceglie di selezionare un'immagine dalla scheda SD, avviare l'intento di aprire la finestra di selezione dell'immagine. La finestra di dialogo del selettore di immagini visualizzerà l'elenco delle app File Manager (se presenti) e l'app gallery predefinita.

linea 55: Mostra la finestra di dialogo di selezione immagine.

linea 61: Sostituire il metodo onActivityResult per gestire l'immagine selezionata.

linea 67: Se l'utente seleziona un'immagine dalla scheda SD, supporta l'URI dell'immagine selezionata (linea 68)

linea 69: considera l'utente seleziona l'immagine dalla scheda SD usando l'app della galleria. L'URI dall'app gallery non fornisce il percorso reale all'immagine selezionata, pertanto deve essere risolto sul fornitore di contenuti. Metodo getRealPathFromURI utilizzato per risolvere il percorso reale dall'URI.

riga 71: Se il percorso è nullo, presupporre che l'utente selezioni l'immagine utilizzando l'app Gestione file. L'app File Manager restituisce informazioni diverse rispetto all'app gallery. Per ottenere il percorso reale sull'immagine selezionata, utilizzare il metodo getImagePath dall'URI (riga 72).

linea 75: Ottieni la bitmap.

linea 77: Se l'utente sceglie di scattare una foto dalla telecamera, ottenere il percorso reale del file temporaneo precedentemente definito nella riga 24-25.

linea 78: Ottieni la bitmap.

riga 81: Visualizza la bitmap nella visualizzazione immagine.

+5

Invece di limitarti a collegare a una risorsa esterna, ti preghiamo di rendere le tue risposte autonome. Per uno c'è il problema di link-rot. Se questo link non funziona, la tua risposta andrà bene. Vedi [questo Meta post per maggiori informazioni sul problema] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). Usare i collegamenti nelle risposte va bene, a patto che la risposta sia ancora valida e utile senza di essi. – Bart

+3

mi ricorderò che la prossima volta grazie – vish

+4

ricordati di seguire le regole di SO vish .. Fornisci risposte, non link .. – Akshat

1

Provare il seguente codice.

File file = new File(path); // path = your file path 
lastSlash = file.toString().lastIndexOf('/'); 

if (lastSlash >= 0) 
{ 
    fileName = url.toString().substring(lastSlash + 1); 
} 


if (fileName.endsWith("pdf")) 
{ 
    mimeType = "application/pdf"; 
} 
else 
{ 
    mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension 
    (MimeTypeMap.getFileExtensionFromUrl(path)); 
} 

Uri uri_path = Uri.fromFile(file); 

Intent intent = new Intent(android.content.Intent.ACTION_VIEW); 
intent.putExtra(PATH, path); 
intent.putExtra(MIMETYPE, mimeType); 
intent.setType(mimeType); 
intent.setDataAndType(uri_path, mimeType); 

startActivity(intent); 
3

utilizzare questo codice, che mi ha aiutato ad aprire tutti i tipi di file ...

private void openFile(File url) { 

    try { 

     Uri uri = Uri.fromFile(url); 

     Intent intent = new Intent(Intent.ACTION_VIEW); 
     if (url.toString().contains(".doc") || url.toString().contains(".docx")) { 
      // Word document 
      intent.setDataAndType(uri, "application/msword"); 
     } else if (url.toString().contains(".pdf")) { 
      // PDF file 
      intent.setDataAndType(uri, "application/pdf"); 
     } else if (url.toString().contains(".ppt") || url.toString().contains(".pptx")) { 
      // Powerpoint file 
      intent.setDataAndType(uri, "application/vnd.ms-powerpoint"); 
     } else if (url.toString().contains(".xls") || url.toString().contains(".xlsx")) { 
      // Excel file 
      intent.setDataAndType(uri, "application/vnd.ms-excel"); 
     } else if (url.toString().contains(".zip") || url.toString().contains(".rar")) { 
      // WAV audio file 
      intent.setDataAndType(uri, "application/x-wav"); 
     } else if (url.toString().contains(".rtf")) { 
      // RTF file 
      intent.setDataAndType(uri, "application/rtf"); 
     } else if (url.toString().contains(".wav") || url.toString().contains(".mp3")) { 
      // WAV audio file 
      intent.setDataAndType(uri, "audio/x-wav"); 
     } else if (url.toString().contains(".gif")) { 
      // GIF file 
      intent.setDataAndType(uri, "image/gif"); 
     } else if (url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) { 
      // JPG file 
      intent.setDataAndType(uri, "image/jpeg"); 
     } else if (url.toString().contains(".txt")) { 
      // Text file 
      intent.setDataAndType(uri, "text/plain"); 
     } else if (url.toString().contains(".3gp") || url.toString().contains(".mpg") || 
       url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi")) { 
      // Video files 
      intent.setDataAndType(uri, "video/*"); 
     } else { 
      intent.setDataAndType(uri, "*/*"); 
     } 

     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intent); 
    } catch (ActivityNotFoundException e) { 
     Toast.makeText(context, "No application found which can open the file", Toast.LENGTH_SHORT).show(); 
    } 
} 
2

Scarica il codice sorgente da qui (https://deepshikhapuri.wordpress.com/2017/04/24/open-pdf-file-from-sdcard-in-android-programmatically/)

activity_main.xml:

<?xml version=”1.0″ encoding=”utf-8″?> 
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221; 
xmlns:tools=”http://schemas.android.com/tools&#8221; 
android:id=”@+id/activity_main” 
android:layout_width=”match_parent” 
android:layout_height=”match_parent” 
android:background=”#efefef”> 

<ListView 
android:layout_width=”match_parent” 
android:id=”@+id/lv_pdf” 
android:divider=”#efefef” 
android:layout_marginLeft=”10dp” 
android:layout_marginRight=”10dp” 
android:layout_marginTop=”10dp” 
android:layout_marginBottom=”10dp” 
android:dividerHeight=”5dp” 
android:layout_height=”wrap_content”> 

</ListView> 
</RelativeLayout> 

MainActivity.java:

package com.pdffilefromsdcard; 

import android.Manifest; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.os.Environment; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.Toast; 

import java.io.File; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

public class MainActivity extends AppCompatActivity { 

ListView lv_pdf; 
public static ArrayList<File> fileList = new ArrayList<File>(); 
PDFAdapter obj_adapter; 
public static int REQUEST_PERMISSIONS = 1; 
boolean boolean_permission; 
File dir; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
init(); 

} 

private void init() { 

lv_pdf = (ListView) findViewById(R.id.lv_pdf); 
dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()); 
fn_permission(); 
lv_pdf.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
@Override 
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
Intent intent = new Intent(getApplicationContext(), PdfActivity.class); 
intent.putExtra(“position”, i); 
startActivity(intent); 

Log.e(“Position”, i + “”); 
} 
}); 
} 

public ArrayList<File> getfile(File dir) { 
File listFile[] = dir.listFiles(); 
if (listFile != null && listFile.length > 0) { 
for (int i = 0; i < listFile.length; i++) { 

if (listFile[i].isDirectory()) { 
getfile(listFile[i]); 

} else { 

boolean booleanpdf = false; 
if (listFile[i].getName().endsWith(“.pdf”)) { 

for (int j = 0; j < fileList.size(); j++) { 
if (fileList.get(j).getName().equals(listFile[i].getName())) { 
booleanpdf = true; 
} else { 

} 
} 

if (booleanpdf) { 
booleanpdf = false; 
} else { 
fileList.add(listFile[i]); 

} 
} 
} 
} 
} 
return fileList; 
} 
private void fn_permission() { 
if ((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { 

if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE))) { 
} else { 
ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, 
REQUEST_PERMISSIONS); 

} 
} else { 
boolean_permission = true; 

getfile(dir); 

obj_adapter = new PDFAdapter(getApplicationContext(), fileList); 
lv_pdf.setAdapter(obj_adapter); 

} 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
if (requestCode == REQUEST_PERMISSIONS) { 

if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

boolean_permission = true; 
getfile(dir); 

obj_adapter = new PDFAdapter(getApplicationContext(), fileList); 
lv_pdf.setAdapter(obj_adapter); 

} else { 
Toast.makeText(getApplicationContext(), “Please allow the permission”, Toast.LENGTH_LONG).show(); 

} 
} 
} 

} 

activity_pdf.xml:

<?xml version=”1.0″ encoding=”utf-8″?> 
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221; 
android:layout_width=”match_parent” 
android:background=”#ffffff” 
android:layout_height=”match_parent” 
android:orientation=”vertical”> 

<com.github.barteksc.pdfviewer.PDFView 
android:id=”@+id/pdfView” 
android:layout_margin=”10dp” 
android:layout_width=”match_parent” 
android:layout_height=”match_parent” /> 
</LinearLayout> 

PdfActivity.java:

package com.pdffilefromsdcard; 

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 

import com.github.barteksc.pdfviewer.PDFView; 
import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener; 
import com.github.barteksc.pdfviewer.listener.OnPageChangeListener; 
import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle; 
import com.shockwave.pdfium.PdfDocument; 

import java.io.File; 
import java.util.List; 

public class PdfActivity extends AppCompatActivity implements OnPageChangeListener,OnLoadCompleteListener { 

PDFView pdfView; 
Integer pageNumber = 0; 
String pdfFileName; 
String TAG=”PdfActivity”; 
int position=-1; 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_pdf); 
init(); 
} 

private void init(){ 
pdfView= (PDFView)findViewById(R.id.pdfView); 
position = getIntent().getIntExtra(“position”,-1); 
displayFromSdcard(); 
} 

private void displayFromSdcard() { 
pdfFileName = MainActivity.fileList.get(position).getName(); 

pdfView.fromFile(MainActivity.fileList.get(position)) 
.defaultPage(pageNumber) 
.enableSwipe(true) 

.swipeHorizontal(false) 
.onPageChange(this) 
.enableAnnotationRendering(true) 
.onLoad(this) 
.scrollHandle(new DefaultScrollHandle(this)) 
.load(); 
} 
@Override 
public void onPageChanged(int page, int pageCount) { 
pageNumber = page; 
setTitle(String.format(“%s %s/%s”, pdfFileName, page + 1, pageCount)); 
} 
@Override 
public void loadComplete(int nbPages) { 
PdfDocument.Meta meta = pdfView.getDocumentMeta(); 
printBookmarksTree(pdfView.getTableOfContents(), “-“); 

} 

public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) { 
for (PdfDocument.Bookmark b : tree) { 

Log.e(TAG, String.format(“%s %s, p %d”, sep, b.getTitle(), b.getPageIdx())); 

if (b.hasChildren()) { 
printBookmarksTree(b.getChildren(), sep + “-“); 
} 
} 
} 
} 

Grazie!

+0

grazie, questo funziona perfettamente! – user3079872

0

direttamente è possibile utilizzare questo codice si aprirà tutti i tipi di file

Intent sharingIntent = new Intent(Intent.ACTION_VIEW); 
    Uri screenshotUri = Uri.fromFile(your_file); 
    sharingIntent.setType("image/png"); 
    sharingIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri); 
    String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(screenshotUri.toString())); 
    sharingIntent.setDataAndType(screenshotUri, type == null ? "text/plain" : type); 
    startActivity(Intent.createChooser(sharingIntent, "Share using")); 
+0

aggiungi Intent.ACTION_VIEW al posto di Intent.ACTION_SEND – balu

0

Si può provare questo

File file = new File(filePath); 
MimeTypeMap map = MimeTypeMap.getSingleton(); 
String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName()); 
String type = map.getMimeTypeFromExtension(ext); 

if (type == null) 
    type = "*/*"; 

Intent intent = new Intent(Intent.ACTION_VIEW); 
Uri data = Uri.fromFile(file); 

intent.setDataAndType(data, type); 

startActivity(intent); 
Problemi correlati