2017-10-02 3 views
2

J'ai une application Android native. Je montre un lien vers le fichier Word dans une zone de texte. Lorsque j'appuie dessus, mon application passe à Google Docs et affiche un message indiquant qu'il n'est pas possible d'ouvrir le document. Je voudrais changer ce comportement et permettre aux utilisateurs de télécharger le fichier sans passer à une application externe. Comment faire?Comment puis-je empêcher l'application android d'ouvrir des fichiers dans des applications externes?

Répondre

0

Utilisez AsynTask pour le fichier de téléchargement du web comme ci-dessous:

private class DownloadFile extends AsyncTask<String, Void, Void> { 
    String fileName=""; 
    @Override 
    protected Void doInBackground(String... strings) { 
     String fileUrl; // -> http://maven.apache.org/maven-1.x/maven.pdf 
     fileUrl = strings[0]; 
      // -> maven.pdf 
     fileName = strings[1]; 
     String extStorageDirectory = Environment.getExternalStorageDirectory().toString()+ "/Android/data/com.mymdsmanager"; 
     File dir = new File(extStorageDirectory); 
     if(!dir.exists()) 
      dir.mkdirs(); 

     File pdfFile = new File(dir, fileName); 

     try{ 
      pdfFile.createNewFile(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
     FileDownloader.downloadFile(fileUrl, pdfFile); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     if (!fileName.equals("")) 
      openMail(fileName); // here i want to open file in mail you can write your own code as per your requirements 

    } 
} 
public void openMail(String tableName){ 
    String[] mailto = {MyApplication.getEmailId()}; 
    String path = Environment.getExternalStorageDirectory().toString()+ "/Android/data/com.mymdsmanager"; 
    File pdfFile = new File(path , tableName); 
    Log.d("File", "openMail: " + pdfFile.getAbsolutePath()); 
    Uri uri = Uri.fromFile(pdfFile); 
    Intent intent = new Intent(Intent.ACTION_SEND); 
    intent.putExtra(Intent.EXTRA_EMAIL, mailto); 

    intent.putExtra(Intent.EXTRA_SUBJECT, "MDS Manager Data - "+tableName); 
    intent.putExtra(Intent.EXTRA_TEXT, "Here is the MDS Manager data export that you requested."); 
    intent.setType("application/pdf"); 
    intent.putExtra(Intent.EXTRA_STREAM, uri); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
} 

FileDownloader.java

public class FileDownloader { 
    private static final int MEGABYTE = 1024 * 1024; 

    public static void downloadFile(String fileUrl, File directory){ 
     try { 

      URL url = new URL(fileUrl); 
      HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); 
      //urlConnection.setRequestMethod("GET"); 
      //urlConnection.setDoOutput(true); 
      urlConnection.connect(); 

      InputStream inputStream = urlConnection.getInputStream(); 
      FileOutputStream fileOutputStream = new FileOutputStream(directory); 
      int totalSize = urlConnection.getContentLength(); 

      byte[] buffer = new byte[MEGABYTE]; 
      int bufferLength = 0; 
      while((bufferLength = inputStream.read(buffer))>0){ 
       fileOutputStream.write(buffer, 0, bufferLength); 
      } 
      fileOutputStream.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

et enfin faire appel de DownloadFile() méthode comme ci-dessous:

new DownloadFile().execute(link, table_name+".pdf"); 

J'espère que cela peut elp you :-)

0

Download Manager est un service système qui gère les téléchargements HTTP de longue durée. Il prend en charge le téléchargement en arrière-plan, réessayer les téléchargements après toutes les pannes, etc. Il est recommandé d'utiliser DownloadManager pour tout téléchargement HTTP à long terme.

public static void downloadFile(Context context, String url, String title, String description) { 

    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); 
    if(title != null) 
     request.setTitle(title); 
    if(description != null) 
     request.setDescription(description); 
    request.allowScanningByMediaScanner(); 
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, title); 

    // get download service and enqueue file 
    DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); 
    manager.enqueue(request); 
} 

Vous pouvez avoir la méthode ci-dessus dans une classe Util, et il peut être appelé de toute activité où vous devez faire le téléchargement à partir en passant le contexte. Le titre et la description peuvent également être transmis dans la méthode pour des notifications plus personnalisées.

Vous pouvez faire quelque chose comme -

viewThatHoldsTheLink.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //call download File 
      downloadFile(mContext, theWordDocUrl, "Abc Document", "Here is your abc document"); 
     } 
    }); 
0

merci beaucoup pour vos suggestions. Ils m'ont donné une idée où regarder dans mon application. Il s'est avéré que le répertoire vers lequel je téléchargeais les fichiers était inaccessible par un utilisateur. J'ai dû le changer pour le répertoire Téléchargements et tout à coup tout a commencé à fonctionner.