Manejo de los intentos de descarga en mi aplicación

Mi aplicación webview ya maneja la URL externa bien (abre los enlaces de aplicaciones externas como viber, navegadores, etc) como este- ( tengo este código de aquí )

// get URL from browsable intent filter TextView uri = (TextView) findViewById(R.id.urlField); // get the url url = getIntent().getDataString(); Uri data = getIntent().getData(); if (data == null) { uri.setText(""); } else { uri.setText(getIntent().getData().toString()); fadeout(); } // } 

En mi configuración de webview

 // Load URL from Browsable intent filter if there is a valid URL pasted if (uri.length() > 0) webView.loadUrl(url); else // dont load 

Esto es cómo manejar las descargas dentro de mi webview

 // download manager webView.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) { DownloadManager.Request request = new DownloadManager.Request( Uri.parse(url)); request.setMimeType(mimeType); String cookies = CookieManager.getInstance().getCookie(url); request.addRequestHeader("cookie", cookies); request.addRequestHeader("User-Agent", userAgent); request.setDescription("Downloading file..."); request.setTitle(URLUtil.guessFileName(url, contentDisposition, mimeType)); request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setDestinationInExternalPublicDir( Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName( url, contentDisposition, mimeType)); DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); dm.enqueue(request); Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_LONG).show(); } }); // download manager 

Sin embargo, me gustaría manejar que las intenciones de descarga pasado por otras aplicaciones también. ¿Cómo puedo hacer eso?

Esto es lo que utilizo para abrir el selector de aplicaciones predeterminado del sistema desde otra aplicación (mi aplicación está incluida aquí).

  // download via... webView.setDownloadListener(new DownloadListener() { public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); startActivity(i); Toast.makeText(getApplicationContext(), "don't choose our app as it can't handle download intents, i have posted a question on stackoverflow though.", Toast.LENGTH_SHORT).show(); } }); // download via.. 

Cada vez que hago clic en un vínculo de descarga, mi aplicación se abre, pero sólo se queda inmóvil en lugar de abrir la url. Quiero que actúe como una aplicación de descarga

Usted tiene que resolver problemas para

  • (A) mostrar siempre al seleccionador
  • (B) dile a android que tu aplicación debería convertirse en parte del selector
  • (C) procesar la "descarga"

(A) mostrar siempre al seleccionador

reemplazar

 startActivity(i); 

con

 startActivity(Intent.createChooser(i, "caption of the choser")); 

(B) dile a android que tu aplicación debería convertirse en parte del selector

En el manifiesto tiene que declarar que tiene una actividad que puede manejar el contenido relevante

 <manifest ... > <application ... > <activity android:name=".MyDownloadActivity" ...> <intent-filter > <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.SEND" /> <action android:name="android.intent.action.SENDTO" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:mimeType="*/*" android:scheme="file" /> </intent-filter> <intent-filter > <!-- mime only SEND(_TO) --> <action android:name="android.intent.action.SEND" /> <action android:name="android.intent.action.SENDTO" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.CATEGORY_OPENABLE" /> <!-- these do not work :-( <data android:scheme="content" android:host="*" /> <data android:scheme="content" android:host="media" android:pathPattern="/external/images/media/.*" /> <data android:host="*" android:scheme="content" android:mimeType="image/*" /> --> <data android:mimeType="*/*" /> </intent-filter> </activity> </application> </manifest> 

* (C) procesar la "descarga"

MyDownloadActivity Su MyDownloadActivity.onCreate() recibirá todos los tipos mime * / * para SEND, SENDTO, VIEW. Para más detalles ver @ Vickyexpert-s respuesta

Intento-intercepción es una herramienta androide libre para analizar intentos. Puede interceptar casi todas las intenciones. Usted puede mirar el código fuente para ver cómo se hace esto.

Yo uso sendtosd como mi manejador de descarga de propósito general. It-s sourcecoder está disponible en github

Es necesario poner debajo de código en su actividad que la respuesta de la intención,

 void onCreate(Bundle savedInstanceState) { // Get intent, action and MIME type Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_VIEW.equals(action)) { */if (type.startsWith("image/“)) {*/ downloadImage(intent); // Download image being sent } } void downloadImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // Write Your Download Code Here } } 
  • ¿Cómo puedo abrir la actividad de conversación de WhatsApp usando datos de contacto?
  • Pid para el proceso que envió una intención
  • ¿Cómo saber qué aplicación fue seleccionada por Intent.createChooser?
  • Cómo abrir la aplicación youtube desde la aplicación android
  • Realmente no obtener setResult y onActivityResult
  • Cambiar la resolución de la cámara mediante programación en android
  • Inicie el visor de intenciones para mostrar la imagen desde url
  • Desplaza las pantallas de una actividad a otra en android
  • Android reconocimiento de voz: startActivityForResult () no funciona
  • Inicio de la actividad mediante la acción personalizada
  • Se pierde el envío de datos a la actividad principal
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.