Как анализировать данные контента, полученные от фильтров намерений в манифесте?

Есть фильтры намерений для файлов kml, которые работают, но я должен получать данные в виде схемы контента. Файл был выбран из File Commander.

данные

content://com.mobisystems.fileman.RemoteFiles/ZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvTG9jYXRpb24lMjBUcmFja2luZy8yMDE5LTA0LTA0JTIwMTclM0EyNyUzQTU5Lmtt/bA/0

Теперь проблема в том, как прочитать этот файл? Как я могу справиться с этой проблемой? Любая помощь будет оценена.

До сих пор я пытался

var uri = Uri.parse(trackString) 

FileInputStream(contentResolver.openFileDescriptor(uri, "r").fileDescriptor) 

contentResolver.openInputStream(uri) // not working

В manifest.xml

<!--Mime type set -->
            <intent-filter>

                <action android:name = "android.intent.action.VIEW" />

                <category android:name = "android.intent.category.DEFAULT" />
                <category android:name = "android.intent.category.BROWSABLE" />

                <data android:scheme = "content" />

                <!-- Valid mime types -->
                <data android:mimeType = "application/vnd.google-earth.kml+xml" />
                <data android:mimeType = "application/vnd.google-earth.kmz" />
                <data android:mimeType = "application/gpx+xml" />

                <!-- Invalid mime types used by some bad software -->
                <data android:mimeType = "application/kml" />
                <data android:mimeType = "application/kmz" />
                <data android:mimeType = "application/gpx" />

                <data android:mimeType = "application/kml+xml" />
                <data android:mimeType = "application/kmz+xml" />

                <data android:mimeType = "application/vnd.google-earth.kml" />
                <data android:mimeType = "application/vnd.google-earth.gpx" />
                <data android:mimeType = "application/vnd.google-earth.kmz+xml" />
                <data android:mimeType = "application/vnd.google-earth.gpx+xml" />

                <data android:mimeType = "text/kml" />
                <data android:mimeType = "text/kmz" />
                <data android:mimeType = "text/gpx" />

                <data android:mimeType = "text/kml+xml" />
                <data android:mimeType = "text/kmz+xml" />
                <data android:mimeType = "text/gpx+xml" />

                <data android:mimeType = "text/xml+kml" />
                <data android:mimeType = "text/xml+kmz" />
                <data android:mimeType = "text/xml+gpx" />

            </intent-filter>

            <!-- Mime type not set but valid extensions -->
            <intent-filter>

                <action android:name = "android.intent.action.VIEW" />

                <category android:name = "android.intent.category.DEFAULT" />
                <category android:name = "android.intent.category.BROWSABLE" />


                <data android:scheme = "content" />

                <data android:host = "*" />

                <data android:pathPattern = "/.*..*..*..*..*\\.gpx" />
                <data android:pathPattern = "/.*..*..*..*..*\\.kml" />
                <data android:pathPattern = "/.*..*..*..*..*\\.kmz" />
                <data android:pathPattern = "/.*..*..*..*\\.gpx" />
                <data android:pathPattern = "/.*..*..*..*\\.kml" />
                <data android:pathPattern = "/.*..*..*..*\\.kmz" />
                <data android:pathPattern = "/.*..*..*\\.gpx" />
                <data android:pathPattern = "/.*..*..*\\.kml" />
                <data android:pathPattern = "/.*..*..*\\.kmz" />
                <data android:pathPattern = "/.*..*\\.gpx" />
                <data android:pathPattern = "/.*..*\\.kml" />
                <data android:pathPattern = "/.*..*\\.kmz" />
                <data android:pathPattern = "/.*\\.gpx" />
                <data android:pathPattern = "/.*\\.kml" />
                <data android:pathPattern = "/.*\\.kmz" />

            </intent-filter>

            <!-- Invalid mime type but valid extensions -->
            <intent-filter>

                <action android:name = "android.intent.action.VIEW" />

                <category android:name = "android.intent.category.DEFAULT" />
                <category android:name = "android.intent.category.BROWSABLE" />


                <data android:scheme = "content" />

                <data android:host = "*" />
                <data android:mimeType = "*/*" />

                <data android:pathPattern = "/.*..*..*..*..*\\.gpx" />
                <data android:pathPattern = "/.*..*..*..*..*\\.kml" />
                <data android:pathPattern = "/.*..*..*..*..*\\.kmz" />
                <data android:pathPattern = "/.*..*..*..*\\.gpx" />
                <data android:pathPattern = "/.*..*..*..*\\.kml" />
                <data android:pathPattern = "/.*..*..*..*\\.kmz" />
                <data android:pathPattern = "/.*..*..*\\.gpx" />
                <data android:pathPattern = "/.*..*..*\\.kml" />
                <data android:pathPattern = "/.*..*..*\\.kmz" />
                <data android:pathPattern = "/.*..*\\.gpx" />
                <data android:pathPattern = "/.*..*\\.kml" />
                <data android:pathPattern = "/.*..*\\.kmz" />
                <data android:pathPattern = "/.*\\.gpx" />
                <data android:pathPattern = "/.*\\.kml" />
                <data android:pathPattern = "/.*\\.kmz" />

            </intent-filter>

Обновления

наконец-то это сработало, я пропускал uri.path вместо uri через intent и ошибался Uri.Parsing, так что продолжайте проверять эту ошибку

contentResolver.openInputStream(uri) // works

Привет, не могли бы вы уточнить, чего вы хотите достичь, читая это? Непонятно, что вы хотите сделать.

Spyros K 04.04.2019 16:21

на самом деле я хочу показать кмл на карте. но это был контент:\\ схема, которую невозможно разобрать, до сих пор я пробовал var uri = Uri.parse(trackString) FileInputStream(contentResolver.openFileDescriptor(uri, "r").fileDescriptor) trackString = content://com .mobisystems.fileman.RemoteFiles/ZmlsZTovLy9zdG‌​9yYWdlL2VtdWxhdGVkLz‌​AvTG9jYXRpb24lMjBUcm‌​Fja2luZy8yMDE5LTA0LT‌​A0JTIwMTclM0EyNyUzQT‌​​​

usman nazir 04.04.2019 16:51

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

usman nazir 05.04.2019 08:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
514
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Используйте ContentResolver и:

  • getType() чтобы узнать MIME-тип контента (поскольку ваш <intent-filter> поддерживает множество типов)
  • openInputStream() читать в содержании

Вы получаете ContentResolver, позвонив getContentResolver() на Context.

     Cursor returnCursor = context.getContentResolver().query(yourFileUri, null, null, null, null);
     int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
     int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
     returnCursor.moveToFirst();
     String name = (returnCursor.getString(nameIndex));        
     File file = new File(context.getCacheDir(), name);
     try {
        InputStream inputStream = context.getContentResolver().openInputStream(yourFileUri);
        FileOutputStream outputStream = new FileOutputStream(file);
        int read = 0;
        int maxBufferSize = 1 * 1024 * 1024;
        int bytesAvailable = inputStream.available();
        int bufferSize = Math.min(bytesAvailable, maxBufferSize);
        final byte[] buffers = new byte[bufferSize];
        while ((read = inputStream.read(buffers)) != -1) {
            outputStream.write(buffers, 0, read);
        }
        inputStream.close();
        outputStream.close();
        Log.d(TAG, "Path " + file.getPath());
        Log.d(TAG, "Size " + file.length());
    } catch (Exception e) {
        Log.e("Exception", e.getMessage());
    }

  // To get the mime type of your file 


 public String getMimeType(Uri uri, Context ctx) {
    String mimeType = null;
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
        ContentResolver cr = ctx.getContentResolver();
        mimeType = cr.getType(uri);
    } else {
        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri
                .toString());
        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
                fileExtension.toLowerCase());
    }
    return mimeType;
 }

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