如何解析清单中从意图过滤器收到的内容数据?

时间:2019-04-04 14:07:15

标签: java android xml android-manifest intentfilter

有一个kml文件的意图过滤器可以工作,但是我必须以内容方案的形式接收数据。 该文件是从File Commander中选取的。

数据

  

content://com.mobisystems.fileman.RemoteFiles/ZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvTG9jYXRpb24lMjBUcmFja2luZy8yMDE5LTA0LTA0JTIwMTclM0EyYy0

现在的问题是如何读取此文件? 我该如何解决这个问题? 任何帮助将不胜感激。

到目前为止,我已经尝试过

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

2 个答案:

答案 0 :(得分:1)

使用ContentResolver和:

  • getType()找出内容的MIME类型(因为您的<intent-filter>支持许多类型)
  • openInputStream()以阅读内容

通过在ContentResolver上调用getContentResolver()获得Context

答案 1 :(得分:0)

     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;
 }