Я попытался прочитать файл csv внутри Google Диска по ссылке.
Но это доступно или невозможно. Если он вернет requestCode, он также вернет «200», но в большинстве случаев он вернет "403".
Несколько дней думал об этом, но не знаю, почему не могу подойти.
Доступ по ссылке через браузер возможен без проблем, а вот доступ через Android студию произошел с ошибками.
Это настройки общего доступа к моим файлам на Google Диске.
public String getPlaylistData(String selectmood){
try {
String pid = "1-5******Ok1iHPVzy2q-Ns"; // url
HttpsURLConnection urlConnection = null;
URL stockURL = new URL("https://drive.google.com/uc?export=view&id = " + pid);
urlConnection = (HttpsURLConnection) stockURL.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
System.out.println("ResponseCode: " + urlConnection.getResponseCode());
// error here!
BufferedReader in = new BufferedReader(new InputStreamReader(stockURL.openConnection().getInputStream()));
CSVReader reader = new CSVReader(in);
String[] nextline;
Integer j = 0;
while ((nextline = reader.readNext()) != null) {
if (!nextline[Category.Playlist_Mood.number].equals(selectmood)) {
continue;
}
moodselect.add(nextline[Category.Playlist_ID.number]);
}
in.close();
if (urlConnection.getErrorStream() != null){
try {
urlConnection.getErrorStream().close();
}catch (IOException e){
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return moodselectid_result;
}
А это мой логкэт.
I/System.out: ResponseCode: 403
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
W/System.err: java.io.FileNotFoundException: https://doc-00-2k-docs.googleusercontent.com/docs/securesc/ha0ro937gcuc7l7deffksulhg5h7mbp1/titjmodt74qf2tnb2i423gujafcd4k2a/1649251650000/05483575271960789860/*/1-5**********E3Ok1iHPVzy2q-Ns?e=view
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:251)
W/System.err: at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
W/System.err: at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:26)
W/System.err: at com.example.cultureforyou.CSVStreamingActivity.getPlaylistData(CSVStreamingActivity.java:202)
W/System.err: at com.example.cultureforyou.CSVStreamingActivity.lambda$ThreadNetwork$0$com-example-cultureforyou-CSVStreamingActivity(CSVStreamingActivity.java:162)
W/System.err: at com.example.cultureforyou.CSVStreamingActivity$$ExternalSyntheticLambda0.run(Unknown Source:4)
W/System.err: at java.lang.Thread.run(Thread.java:764)
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
Я пробовал следующие методы. но не работает.
1. Добавлены следующие настройки:
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
android:usesCleartextTraffic = "true"
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getURL().openStream()));
Проблема заключается в URL-адресе, который вы используете под stockURL
.
Похоже, вы выполняете простую выборку в формате URL https://drive.google.com/uc?export=view&id=[file id]
. Я нашел этот же формат на нескольких сайтах, включая отвечать с этого самого сайта. Его можно использовать для загрузки или встраивания файлов прямо с Диска.
Проблема в том, что вы пытаетесь загрузить файл Google Sheets, который имеет другой URL-адрес для загрузки. Вместо этого вы должны использовать https://docs.google.com/spreadsheets/d/[file id]/export
. Поскольку вы хотите, чтобы он был в формате CSV, вы можете добавить ?format=csv
в конце.
Таким образом, вы можете просто изменить свою переменную stockURL
на это:
URL stockURL = new URL("https://docs.google.com/spreadsheets/d/" + pid + "/export?format=csv");
Кстати, файлы Google Docs используют URL-адрес https://docs.google.com/document/d/[file id]/export
. Я попробовал несколько других типов файлов, и они используют обычный URL-адрес Диска, но могут быть и другие исключения. Вы можете проверить это самостоятельно, попробовав загрузить файлы с Диска и проверив вкладку «Сеть» в инструментах разработчика вашего браузера.
Единственная странная деталь заключается в том, что вы получаете ответ 403
вместо 404
, java.io.FileNotFoundException
должно означать, что файл отсутствует, а не то, что у вас нет разрешения на доступ к нему. Я не эксперт по Java, но этот другой отвечать объясняет, что, по крайней мере, в Spring Security это может произойти из-за определенных настроек. Возможно, что-то подобное происходит и в вашем случае.
нет файла с URL
https://doc-00-2k-docs.googleusercontent.com/docs/securesc/ha0ro937gcuc7l7deffksulhg5h7mbp1/titjmodt74qf2tnb2i423gujafcd4k2a/1649251650000/05483575271960789860/*/1-5**********E3Ok1iHPVzy2q-Ns?e=view
. Вы скрыли тот или иной URL-адрес, который вы используете?