我想从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时,它可以工作。
答案 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)
这适用于我以及我在“共享文件夹”应用中使用的内容:
在资源下创建一个名为xml的文件夹
向其中添加file_paths.xml,并在其中添加以下行:
<files-path name="internal" path="/"/>
在清单中添加文件提供者授权,如下:
<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
文件,并用extends
来FileProvider
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" />