Java.io.FileNotFoundException в Android при доступе к файлам на Google Диске

Я попытался прочитать файл csv внутри Google Диска по ссылке.
Но это доступно или невозможно. Если он вернет requestCode, он также вернет «200», но в большинстве случаев он вернет "403".
Несколько дней думал об этом, но не знаю, почему не могу подойти.
Доступ по ссылке через браузер возможен без проблем, а вот доступ через Android студию произошел с ошибками.


Это настройки общего доступа к моим файлам на Google Диске.

Java.io.FileNotFoundException в 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");
  1. Добавлен следующий код (AndroidManifest.xml):
android:usesCleartextTraffic = "true"
  1. Я изменил код, в котором возникает ошибка, на код ниже.
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getURL().openStream()));

нет файла с URL https://doc-00-2k-docs.googleusercontent.com/docs/securesc/h‌​a0ro937gcuc7l7deffks‌​ulhg5h7mbp1/titjmodt‌​74qf2tnb2i423gujafcd‌​4k2a/1649251650000/0‌​5483575271960789860/‌​*/1-5**********E3Ok1‌​iHPVzy2q-Ns?e=view. Вы скрыли тот или иной URL-адрес, который вы используете?

Sambhav. K 06.04.2022 17:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключается в 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 это может произойти из-за определенных настроек. Возможно, что-то подобное происходит и в вашем случае.

Другие вопросы по теме