Intereting Posts

Скачивание ссылок в моем приложении

Мое приложение webview уже обрабатывает внешний URL-адрес (открывает ссылки из внешних приложений, таких как viber, браузеры и т. Д.), Например this (( я получил этот код отсюда )

// 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(); } // } 

В настройках веб-просмотра

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

Это то, как я обрабатываю загрузки в своем веб-просмотре

 // 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 

Тем не менее, я бы хотел обработать эти загрузочные намерения, переданные другими приложениями. Как мне это сделать?

Это то, что я использую для открытия системного выбора приложений по умолчанию из другого приложения (мое приложение указано здесь) –

  // 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.. 

Всякий раз, когда я нажимаю ссылку для загрузки, мое приложение открывается, но просто сидит, а не открывает URL-адрес. Я хочу, чтобы он работал как приложение для загрузки

Вам необходимо решить проблемы

  • (А) всегда показывать выборку
  • (B) сообщите Android, что ваше приложение должно стать частью выбора
  • (C) обрабатывать "загрузку"

(А) всегда показывать выборку

замещать

 startActivity(i); 

с

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

(B) сообщите Android, что ваше приложение должно стать частью выбора

В манифесте вы должны объявить, что у вас есть активность, которая может обрабатывать соответствующий контент

 <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) обработать "загрузку"

MyDownloadActivity MyDownloadActivity.onCreate() получит все типы mime * / * для SEND, SENDTO, VIEW. Подробнее см. @ Vickyexpert-s ответ

Захват-перехват – это бесплатный инструмент андроида для анализа намерений. Он может перехватить почти все намерения. Вы можете посмотреть исходный код, чтобы узнать, как это делается.

Я использую sendtosd в качестве моего универсального загрузчика. Его исходный код доступен на github

Вы должны ввести ниже код в свою деятельность, ответ на который намечен,

 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 } }