将文件uri转换为内容uri

时间:2011-09-05 08:22:12

标签: android

我想从astro管理器中选择一个文件(通过文件选择器)(在我的例子中是* .pdf或* .doc),但是uri只包含文件路径("sdcard/my_folder/test.pdf")。对于我的应用程序,我需要像图像选择器那样的内容路径(内容:// media / external / images / media / 2 )。有没有办法将"file:///"转换为"content://" uri?

还是有人知道如何解决这个问题吗?

最好的问候

更新:主要问题是在我选择带有filechooser的文件后,valuecallback.onReceiveValue(uri)方法在路径后面添加了一个“/”。所以我得到一个这样的uri:“sdcard / my_folder / test.pdf /”,我的应用程序认为pdf是一个文件夹。当我使用来自图像选择器的内容uri时,它可以工作。

5 个答案:

答案 0 :(得分:15)

与@CommmonsWare一样,没有简单的方法可以将任何类型的文件转换为内容:// 但这是我如何将图像文件转换为content://

public static Uri getImageContentUri(Context context, File imageFile) {
    String filePath = imageFile.getAbsolutePath();
    Cursor cursor = context.getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            new String[] { MediaStore.Images.Media._ID },
            MediaStore.Images.Media.DATA + "=? ",
            new String[] { filePath }, null);

    if (cursor != null && cursor.moveToFirst()) {
        int id = cursor.getInt(cursor
                .getColumnIndex(MediaStore.MediaColumns._ID));
        Uri baseUri = Uri.parse("content://media/external/images/media");
        return Uri.withAppendedPath(baseUri, "" + id);
    } else {
        if (imageFile.exists()) {
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.DATA, filePath);
            return context.getContentResolver().insert(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        } else {
            return null;
        }
    }
}

答案 1 :(得分:6)

这是一种更简单的方法,可能适合您。

我使用它在谷歌加上从我的Android应用程序共享下载的图像:

/**
 * Converts a file to a content uri, by inserting it into the media store.
 * Requires this permission: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 */
protected static Uri convertFileToContentUri(Context context, File file) throws Exception {

    //Uri localImageUri = Uri.fromFile(localImageFile); // Not suitable as it's not a content Uri

    ContentResolver cr = context.getContentResolver();
    String imagePath = file.getAbsolutePath();
    String imageName = null;
    String imageDescription = null;
    String uriString = MediaStore.Images.Media.insertImage(cr, imagePath, imageName, imageDescription);
    return Uri.parse(uriString);
}

答案 2 :(得分:1)

实现这一目标的一种简单方法是使用 MediaScannerConnection

CREATE TABLE users (
    id int NOT NULL IDENTITY(1,1),
    login varchar(30) NOT NULL,
    password varchar(32) NOT NULL,
    secret varchar(16) NOT NULL,
    PRIMARY KEY (id),
    UNIQUE (login)
);

答案 3 :(得分:1)

这适用于我以及我在“共享文件夹”应用中使用的内容:

  1. 在资源下创建一个名为xml的文件夹

  2. 向其中添加file_paths.xml,并在其中添加以下行:

    <files-path name="internal" path="/"/>

  3. 在清单中添加文件提供者授权,如下:

<provider android:name="android.support.v4.content.FileProvider"
               android:authorities="com.dasmic.filebrowser.FileProvider"
               android:windowSoftInputMode="stateHidden|adjustResize"
               android:exported="false"
               android:grantUriPermissions="true">
               <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_paths" />
  </provider>

4。使用“ content://”将文件传输到其他意图,如下所示:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //Required for Android 8+
Uri data = FileProvider.getUriForFile(this, "com.dasmic.filebrowser.FileProvider", file);
intent.setDataAndType(data, type);
startActivity(intent);

答案 4 :(得分:0)

您可以使用FileProvider实现它

步骤1: 创建一个java文件,并用extendsFileProvider

public class MyFileProvider extends FileProvider {

}

第2步:xml目录中创建一个res/xml/资源文件,并将此代码复制到其中

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

第3步: 在您的manifest文件中的<Application>标签下,添加此代码

<provider
            android:name="MyFileProvider" <!-- java file created above -->
            android:authorities="${applicationId}.MyFileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/> <!-- xml file created above -->
        </provider>

第4步: 使用此代码以Uri格式获取content://

Uri uri = FileProvider.getUriForFile(CameraActivity.this, "your.package.name.MyFileProvider", file /* file whose Uri is required */);

注意: 您可能需要添加读取权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />