Получить файл с Google диска с помощью намерения - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь загрузить документ из своего приложения.

Все работает нормально, но когда я выбираю файл с диска.

data=Intent { act=android.intent.action.VIEW dat=content://com.google.android.apps.docs.storage.legacy/enc=ckpgt5KcEEF_JYniJQafRV_5pEnu_D5UAI1WF-Lu6h2Z_Vw4
     (has extras) }}

Может ли кто-нибудь знает, как обрабатывать этот файл.

Я уже обработал все файлы и изображения, столкнувшиеся только с проблемой с файлами на диске Google.

Я получаюэто content://com.google.android.apps.docs.storage.legacy/enc=ckpgt5KcEEF_JYniJQafRV_5pEnu_D5UAI1WF-Lu6h2Z_Vw4 в намерениях данных Uri.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Обрабатывать Uri, полученные файлами Google-Drive при выборе с помощью средства выбора файлов.

, как указано ранее, он получает Virual File Uri .

Я нашел этот образецКод простой и понятный.Данный пример кода работает для меня. Надеюсь, он работает в вашем случае.

1.Вы обнаружите, что этот URI получен Google Drive.

public static File getFileFromUri(final Context context, final Uri uri) throws Exception {

if (isGoogleDrive(uri)) // check if file selected from google drive
{ 
  return saveFileIntoExternalStorageByUri(context, uri);
}else 
    // do your other calculation for the other files and return that file
   return null;
}


public static boolean isGoogleDrive(Uri uri)
{
 return "com.google.android.apps.docs.storage.legacy".equals(uri.getAuthority());
}

2.Если да, URIсохраняется по внешнему пути (здесь его корневой каталог вы можете изменить в соответствии с вашими потребностями), и создается файл с таким URI.

 public static File saveFileIntoExternalStorageByUri(Context context, Uri uri) throws 

Exception {
        InputStream inputStream = context.getContentResolver().openInputStream(uri);
        int originalSize = inputStream.available();

        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        String fileName = getFileName(context, uri);
        File file = makeEmptyFileIntoExternalStorageWithTitle(fileName);
        bis = new BufferedInputStream(inputStream);
        bos = new BufferedOutputStream(new FileOutputStream(
                file, false));

        byte[] buf = new byte[originalSize];
        bis.read(buf);
        do {
            bos.write(buf);
        } while (bis.read(buf) != -1);

        bos.flush();
        bos.close();
        bis.close();

        return file;

    }

public static String getFileName(Context context, Uri uri) 
{
  String result = null;
  if (uri.getScheme().equals("content")) {
  Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
  try {
       if (cursor != null && cursor.moveToFirst()) {
        result = cursor.getString(cursor.getColumnInde(OpenableColumns.DISPLAY_NAME));
       }
      } finally {
                cursor.close();
            }
        }
        if (result == null) {
            result = uri.getPath();
            int cut = result.lastIndexOf('/');
            if (cut != -1) {
                result = result.substring(cut + 1);
            }
        }
        return result;
}


public static File makeEmptyFileIntoExternalStorageWithTitle(String title) {
        String root =  Environment.getExternalStorageDirectory().getAbsolutePath();
        return new File(root, title);
    }

Примечание. Здесь виртуальный файл извлекается из Intent getData() и используется в context.getContentResolver().openInputStream(intent.getData()), это вернет InputStream.Это дескриптор, чтобы получить выбранный файл с Google Drive.

для получения дополнительной информации перейдите по этой ссылке

0 голосов
/ 10 декабря 2018

Я думаю, что вы получаете Virtual File Uri от Google Drive

Подробнее о Virtual Files

ИЗ DOCS

Виртуальные файлы

  • Android 7.0 добавляет концепцию виртуальных файлов в Storage Access Framework.Функция виртуальных файлов позволяет вашему DocumentsProvider возвращать документ URIs, который можно использовать с намерением ACTION_VIEW, даже если они не имеют прямого представления bytecode.Android 7.0 также позволяет вам предоставлять альтернативные форматы для пользовательских файлов, виртуальные или иные

Теперь вопрос заключается в том, как проверить, Uri является VirtualFile или нет

Вы можете найти пример кода из DOCS. Открыть виртуальные файлы

Сначала убедитесь, что Uri является VirtualFile или нет

private boolean isVirtualFile(Uri uri) {
    if (!DocumentsContract.isDocumentUri(this, uri)) {
        return false;
    }

    Cursor cursor = getContentResolver().query(
        uri,
        new String[] { DocumentsContract.Document.COLUMN_FLAGS },
        null, null, null);

    int flags = 0;
    if (cursor.moveToFirst()) {
        flags = cursor.getInt(0);
    }
    cursor.close();

    return (flags & DocumentsContract.Document.FLAG_VIRTUAL_DOCUMENT) != 0;
}

В следующем фрагменте кода показано, какпроверить, может ли виртуальный файл быть представлен как изображение, и, если это так, получает входной поток из виртуального файла

private InputStream getInputStreamForVirtualFile(Uri uri, String mimeTypeFilter)
    throws IOException {

    ContentResolver resolver = getContentResolver();

    String[] openableMimeTypes = resolver.getStreamTypes(uri, mimeTypeFilter);

    if (openableMimeTypes == null ||
        openableMimeTypes.length < 1) {
        throw new FileNotFoundException();
    }

    return resolver
        .openTypedAssetFileDescriptor(uri, openableMimeTypes[0], null)
        .createInputStream();
}

Для получения дополнительной информации о виртуальных файлах вы можете прочитать ниже статью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...