Не удается получить доступ к файлу Google Drive из Android, когда я впервые загрузил его через браузер

#android #google-drive-api #google-drive-android-api

#Android #google-drive-api #google-drive-android-api

Вопрос:

Я использую диск.DriveApi в Android. Экспорт, а затем импорт файла из моего приложения Android на Google Drive работает в обоих направлениях.

Я также могу получить доступ к файлу и загрузить его из веб-браузера на свой локальный Mac.

Однако, если я сначала загружу новый файл на Google Drive со своего Mac, а затем попытаюсь получить доступ к этому файлу из своего приложения для Android и импортировать его, я не смогу получить доступ к файлу. Я вижу файл, но он выделен серым цветом.

Я использую одного и того же пользователя как в приложении Android, так и в Интернете на моем Mac с Google Drive.

Кто-нибудь?

Мой код, который я использую. Импорт:

         IntentSender intentSender = Drive.DriveApi
                .newOpenFileActivityBuilder()
                .setMimeType(new String[]{"application/csv"})
                .build(activity.getGoogleClient());
        try {
            activity.startIntentSenderForResult(intentSender, DRIVE_REQUEST_CODE_OPENER_IMPORT, null, 0, 0, 0);
        } catch (IntentSender.SendIntentException e) {
            Log.w(TAG, "Unable to send intent: ", e);
        }
  

Экспорт:

         Drive.DriveApi.newDriveContents(activity.getGoogleClient()).setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
            @Override
            public void onResult(DriveApi.DriveContentsResult driveContentsResult) {
                Uri csvUri = Uri.parse("file://"   getCsvFile(context));
                File csvFile = new File(csvUri.getPath());
                if(csvFile.length() <= 0) {
                    Log.e(TAG, "File empty: "   getCsvFile(context));
                }
                FileInputStream csvInputStream = null;
                try {
                    csvInputStream  = new FileInputStream(csvFile);
                    OutputStream outputStream = driveContentsResult.getDriveContents().getOutputStream();
                    byte[] dataArray = IOUtils.toByteArray(csvInputStream);
                    outputStream.write(dataArray);
                } catch (FileNotFoundException fnfe) {
                    Log.e(TAG, "File not found: ", fnfe);
                } catch (IOException ie) {
                    Log.e(TAG, "Error uploading file: ", ie);
                }
                MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder().setMimeType("application/csv").setTitle(getCsvFilename()).build();
                IntentSender intentSender = Drive.DriveApi
                        .newCreateFileActivityBuilder()
                        .setInitialMetadata(metadataChangeSet)
                        .setInitialDriveContents(driveContentsResult.getDriveContents())
                        .build(activity.getGoogleClient());
                try {
                    activity.startIntentSenderForResult(intentSender, DRIVE_REQUEST_CODE_OPENER_EXPORT, null, 0, 0, 0);
                } catch (IntentSender.SendIntentException e) {
                    Log.w(TAG, "Unable to send intent: ", e);
                }
            }
        });
  

onActivityResult:

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    final Uri csvUri = Uri.parse("file://"   getCsvFile(context));
    final File csvFile = new File(csvUri.getPath());
    if(requestCode == DRIVE_REQUEST_CODE_OPENER_IMPORT amp;amp; resultCode == activity.RESULT_OK amp;amp; data != null) {
        DriveId driveId = (DriveId) data.getParcelableExtra(OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID);
        Log.i(TAG, "Selected file's ID: "   driveId);
        driveId.asDriveFile().open(activity.getGoogleClient(), DriveFile.MODE_READ_ONLY, null).setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
            @Override
            public void onResult(DriveApi.DriveContentsResult driveContentsResult) {
                try {
                    InputStream input = driveContentsResult.getDriveContents().getInputStream();
                    byte[] dataArray = IOUtils.toByteArray(input);
                    FileUtils.writeByteArrayToFile(csvFile, dataArray);
                    finish.onImportFinished();
                } catch (IOException ie) {
                    Log.e(TAG, "Error downloading file: ", ie);
                }
            }
        });
    } else if(requestCode == DRIVE_REQUEST_CODE_OPENER_EXPORT amp;amp; resultCode != activity.RESULT_CANCELED) {
        finish.onExportFinished();
    }
    csvFile.delete();   // Always delete to avoid readable file on disk
}
  

Не удается выбрать file vault.csv

введите описание изображения здесь

Update1:

 public void initGoogleClient() {
    if (mGoogleApiClient == null) {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Drive.API)
                .addScope(Drive.SCOPE_FILE)
                .addScope(Drive.SCOPE_APPFOLDER)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
    }
    mGoogleApiClient.connect();
}
  

Update2:

Однако, если я сначала экспортирую файл из своего приложения для Android. Затем загрузите файл из моего браузера на моем Mac, добавьте некоторые данные. Загрузите его с моего Mac. Теперь импорт этого файла из моего приложения для Android работает.

Есть ли способ изменить привилегии для вновь загруженного файла через веб-интерфейс Google Drive? Другие комментарии?

Обновить3 мой браузер Mac Google Drive:

введите описание изображения здесь

Комментарии:

1. Какие области вы используете во время запроса авторизации в обоих приложениях?

2. Хороший момент, пытаюсь выяснить, где я определяю область действия. Есть идеи?

3. во время рукопожатия oath.

4. Добавлен мой код области видимости, см. Update1 выше. Я не уверен, что мне нужно сюда добавить?

5. Я думаю, что вы загружаете файлы в собственную папку приложения. Никакое другое приложение не может получить к нему доступ.

Ответ №1:

Изменен тип MIME на

   .setMimeType(new String[]{"text/csv"})
  

Комментарии:

1. Я не могу выбрать разные типы, такие как .ai /.aps также пробовал .setMimeType (новая строка []{«application / postscript»}) это расширение типа MIME для .ai /.eps