В последнее время я читал ответ на такие вопросы из-за переполнения стека.Большая часть ответа заключалась в том, чтобы поместить открытый идентификатор файла в эту ссылку https://googledrive.com/host/ID
, которая сейчас не поддерживается.
Даже если я попытаюсь установить https://docs.google.com/uc?export=download&id=ID
, произойдет сбой для файлов, превышающих лимит сканирования (в основном для 100 МБ), кроме него.создает файл HTML.Это страница с предупреждением о сканировании Google.
При поиске решения или идеи я нашел ответ https://stackoverflow.com/a/32742700/10133501, в котором используется curl для первой загрузки и сохранения файлов cookie, затем получить ссылку со страницы HTML и начать загрузку.файл с куки.
Так как я не могу использовать curl в Android.Я думал о создании моего пути, как показано ниже.
// I first download the html page from url and save it to /sdcard/insight/new.html
String url = "http://www.drive.google.com/uc?export=download&id=1In9hgu0eN9ftaiLlPROj05rwJPTeGVFM";
WebView mWebview = new WebView(this);
mWebview.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
final String cookies = CookieManager.getInstance().getCookie(url);
Log.e("Cookie", cookies);
try {
File root = android.os.Environment.getExternalStorageDirectory();
File file = new File (root.getAbsolutePath() + "/Insight/new.html");
BufferedReader r = new BufferedReader(new FileReader(file));
StringBuilder total = new StringBuilder();
String line;
while((line = r.readLine()) != null) {
if (line.contains("uc-download-link"))
{
Log.e("Line","Contains uc-download-link");
Pattern pattern = Pattern.compile("\"/uc(.*?)confirm(.*?)\"");
Matcher matcher = pattern.matcher(line);
if (matcher.find())
{
String link = "https://drive.google.com" + matcher.group().replace("\"","").replace("&","&");
Log.e("Link",link);
// Start the download by passing cookies...
startDownload(link,Uri.fromFile(CommonClass.getFile("Insight/new.zip")),cookies);
} else Log.e("NotFound","Can't find the match");
}
else Log.e("Line","No match");
total.append(line);
}
r.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
mWebview.loadUrl(url);
Что касается файла размером более 100 МБ, создающего HTML-страницу.Я сначала загружаю страницу в мой internal storage/insight/new.html
.Затем я создаю экземпляр webview и загружаю URL, чтобы я мог получить cookies
из него.
Как только я его получу!Я анализирую html-страницу и извлекаю ссылку для скачивания с кодом подтверждения (см. Ответ выше, я просто выполнил шаги, которые он сделал с curl, вместо этого я использую регулярные выражения и прочее).Теперь у меня есть все, поэтому я создал функцию startdownload
для загрузки файла, используя Download Manager
, который передает cookies
в заголовках как "Cookie"
(код функции ниже).
public void startDownload(String url, Uri destir,String cookie) {
Uri resource = Uri.parse(url);
DownloadManager.Request request = new DownloadManager.Request(resource);
request.addRequestHeader("Cookie", cookie);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setAllowedOverRoaming(false);
//show notification
request.setVisibleInDownloadsUi(true);
//set target directory
request.setDestinationUri(destir);
request.setTitle("Download");
request.setDescription("What the heck is this!");
DownloadManager downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
long id = downloadManager.enqueue(request);
Log.e("download", "Start download, id = " + id);
}
Но он по-прежнему сохраняет загрузкуэта HTML-страница, даже после передачи файлов cookie.Я следовал точно так же, как и он, используя curl в приведенном выше ответе, но все еще не смог.
Я думаю, что проблема может быть связана с запросом Cookie.Файл cookie, запрашиваемый у CURL
, немного отличается, см. Здесь https://pastebin.com/QxLU6kSu. В то время как моя строка cookie, сообщаемая из устройства регистрации Android, выглядит следующим образом
download_warning_13058876669334088843_1In9hgu0eN9ftaiLlPROj05rwJPTeGVFM qnTb;NID=162=UW_Hkn3eHdTldNeLwbPUcsY8P5zaFX6H5ePsHhPlUHO1Ahiy10yyoGT9I3zQeTcHYSplxUjdL0OLi6rhcgViC4WhYYayg4XRs5FSMGNfkIgFBkGmukDf4KJZ-AxSz77w2JvkC7WsuaMLJue9zl9wxAmKEotzRa75Y5kUHRXGkoM
В чем именно проблема.Почему он все еще не загружается?
Также
Я пытался использовать service account
с для Google.drive.Api, но не получилось.Любой, у кого есть эта работа, также может решить мою проблему.Это код, который я использовал для этого https://pastebin.com/RGTwLsHp
Любая помощь по этой теме, очень признателен!Спасибо!