java.io.FileNotFoundException 在 Android 访问 Google 驱动器上的文件
java.io.FileNotFoundException in Android accessing files on Google Drive
我试图通过link读取Google里面的csv文件。
但它是可访问的或不可能的。如果它 return requestCode,它也会 return '200',但在大多数情况下它会 return '403'。
想了几天,不知道为什么不能靠近。
通过浏览器访问 link 可以没有任何问题,但通过 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;
}
这是我的logcat。
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[=14=]$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");
- 添加了以下代码 (AndroidManifest.xml):
android:usesCleartextTraffic="true"
- 我把出错的代码改成了下面的代码
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getURL().openStream()));
问题是您在 stockURL
下使用的 URL。
您似乎正在使用 URL 格式 https://drive.google.com/uc?export=view&id=[file id]
进行简单的提取。我在几个网站上发现了这种相同的格式,包括来自这个网站的 answer。它可用于直接从云端硬盘下载或嵌入文件。
问题是您正在尝试下载 Google 表格文件,该文件的下载方式不同 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 文档文件使用 URL https://docs.google.com/document/d/[file id]/export
。我尝试了其他几种文件类型,它们使用常规驱动器 URL,但可能还有其他例外情况。您可以通过尝试从云端硬盘下载文件并检查浏览器开发人员工具中的“网络”选项卡来自行检查。
唯一奇怪的细节是您得到的是 403
响应而不是 404
,java.io.FileNotFoundException
应该暗示文件丢失,而不是您没有访问它的权限。我不是 Java 专家,但另一位 解释说,至少在 Spring 安全方面,由于某些设置可能会发生这种情况。也许您的情况也发生了类似的事情。
我试图通过link读取Google里面的csv文件。
但它是可访问的或不可能的。如果它 return requestCode,它也会 return '200',但在大多数情况下它会 return '403'。
想了几天,不知道为什么不能靠近。
通过浏览器访问 link 可以没有任何问题,但通过 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;
}
这是我的logcat。
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[=14=]$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");
- 添加了以下代码 (AndroidManifest.xml):
android:usesCleartextTraffic="true"
- 我把出错的代码改成了下面的代码
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getURL().openStream()));
问题是您在 stockURL
下使用的 URL。
您似乎正在使用 URL 格式 https://drive.google.com/uc?export=view&id=[file id]
进行简单的提取。我在几个网站上发现了这种相同的格式,包括来自这个网站的 answer。它可用于直接从云端硬盘下载或嵌入文件。
问题是您正在尝试下载 Google 表格文件,该文件的下载方式不同 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 文档文件使用 URL https://docs.google.com/document/d/[file id]/export
。我尝试了其他几种文件类型,它们使用常规驱动器 URL,但可能还有其他例外情况。您可以通过尝试从云端硬盘下载文件并检查浏览器开发人员工具中的“网络”选项卡来自行检查。
唯一奇怪的细节是您得到的是 403
响应而不是 404
,java.io.FileNotFoundException
应该暗示文件丢失,而不是您没有访问它的权限。我不是 Java 专家,但另一位