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
- Cómo transferir valor booleano entre las actividades en android?
- Terminar una llamada entrante mediante programación en android
- ¿Cuáles son las diferencias entre FLAG_ACTIVITY_RESET_TASK_IF_NEEDED y FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP?
- Android EXTRA_MESSAGE no reconocido dentro de Recycler View Adapter
- ¿Cuál es el propósito de IntentSender?
// 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
- Evento de calendario intent - startActivityForResult
- Cómo iniciar la actividad con FLAG_REORDER_TO_FRONT y FLAG_CLEAR_TOP
- SMS enviados / entregados: ¿cómo identificas a qué SMS pertenece la emisión?
- Intención de contacto con múltiples selecciones
- Cómo mostrar la actividad transparente en la otra actividad sin eliminar la actividad anterior
- ¿Qué es una emisión pegajosa?
- Pasando el archivo con intención, ¿cómo lo recupero?
- Uso de Phonegap para enviar SMS y mostrar en Bandeja de entrada
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 } }
- Sobre poblar Logcat hace que las ventanas se congelen, hasta que se realice el reinicio duro
- Opencv face recognition devuelve el mismo nombre de DB para usuarios desconocidos