2015-07-13 6 views
5

Sto scaricando un file dal server al termine del download Devo aprire un file. Conoscere il problema è che il file potrebbe essere di qualsiasi tipo, quindi non posso specificare e Intent call per aprire un file con nome statico come facciamo per aprire un file PDF. Quello che voglio è quando un file viene scaricato che cercherà se è disponibile qualsiasi app per aprire il file che mostrerà pop-up. Sto facendo tutto questo all'interno del frammento. Ecco il mio codice per il download:Come aprire il file scaricato in Android con l'applicazione availabe predefinita in Android

public class DownloadFile extends AsyncTask<String, Void, Integer> { 
    String file_name = ""; 
    File sdcard = Environment.getExternalStorageDirectory(); 
    @Override 
    protected Integer doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     try { 
      HttpURLConnection url_conn = null; 
      byte[] bffr; 

      long totalSize = 0; 
      File directory = new File(
        Environment.getExternalStorageDirectory() 
          + "/xyz/download"); 
      directory.mkdirs(); 
      // 06-03 17:57:41.160: D/file name(6882): 
      file_name = ""; 
      file_name = params[0]; 
      Log.d("file name", file_name.toString()); 
      url_conn = (HttpURLConnection) (new URL("http://example.com/uploads/" + file_name)).openConnection(); 
      url_conn.setRequestMethod("GET"); 
      url_conn.setDoOutput(true); 
      url_conn.connect(); 

      if (url_conn.getContentLength() > 0) { 
       File imgFile = new File(sdcard + "/xyz/download/",file_name); 
       FileOutputStream fos = new FileOutputStream(imgFile); 
       InputStream is = url_conn.getInputStream(); 
       totalSize = url_conn.getContentLength(); 
       // Log.d("File Download Size ",totalSize+""); 
       long total = 0; 
       bffr = new byte[1024]; 
       int bufferLength = 0; 
       while ((bufferLength = is.read(bffr)) > 0) { 
        total += bufferLength; 
        publishProgress("" + (int) ((total * 100)/totalSize)); 
        fos.write(bffr, 0, bufferLength); 
       } 
       fos.close(); 
      } else 
       Log.w(file_name.toString(), "FILE NOT FOUND"); 
      return 0; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return -1; 
     } 

    } 

    private void publishProgress(String... process) { 
     // TODO Auto-generated method stub 
     mprogressDialog.setProgress(Integer.parseInt(process[0])); 
    } 

    protected void onPostExecute(Integer unused) { 
     Log.d("after downloading file ", "file downloaded "); 
     switch (unused) { 
     case 0: 
      mprogressDialog.dismiss(); 
      Intent install = new Intent(Intent.ACTION_VIEW); 
       install.setDataAndType(Uri.fromFile(new File(sdcard + "/xyz/download/",file_name)), 
         "MIME-TYPE"); 
       install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       app.getBaseContext().startActivity(install); 
      break; 
     } 
    } 
} 

Nella fase di post execute ho cercato di aprirlo con intenti ma che non ha funzionato. Qualsiasi idea è apprezzata

risposta

5
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); 

Vedi this troppo ..

0
install.setDataAndType(Uri.fromFile(new File(sdcard + "/xyz/download/",file_name)), 
        "MIME-TYPE"); 

È necessario impostare mime-type in base al tipo di file e si aprirà in applicazioni disponibili nel dispositivo consultare questo https://stackoverflow.com/a/24134677/3303075

0

Immagino che devi passare un tipo mime valido per ottenere popup di selezione app. puoi ottenere mimeType dal nome del file o dall'istanza del file.

String fileName = "/path/to/file"; 
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap(); 

// only by file name 
String mimeType = mimeTypesMap.getContentType(fileName); 

fonte https://stackoverflow.com/a/1902146/942224

0

Dopo il download fare questo--

MimeTypeMap myMime = MimeTypeMap.getSingleton(); 
    Intent newIntent = new Intent(Intent.ACTION_VIEW); 
    String mimeType = myMime.getMimeTypeFromExtension(fileExt(path).substring(1)); 
    newIntent.setDataAndType(Uri.fromFile(new File(path)), mimeType); 
    newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    try { 
     ReadMailActivity.this.startActivity(newIntent); 
    } catch (ActivityNotFoundException e) { 
     Toast.makeText(ReadMailActivity.this, "No handler for this type of file.", Toast.LENGTH_LONG).show(); 
    }