Android 使用getContentResolver()打开文件提供程序内容Uri。openInputStream(Uri)始终在输入流中返回-1
在android清单中,在应用程序标记中添加了FileProviderAndroid 使用getContentResolver()打开文件提供程序内容Uri。openInputStream(Uri)始终在输入流中返回-1,android,xml,uri,android-fileprovider,Android,Xml,Uri,Android Fileprovider,在android清单中,在应用程序标记中添加了FileProvider <application . . <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriP
<application
.
.
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>
我在ActivityResult中获得的内容Uri:
content://com.example.sample.provider/files/xyz/image/JPEG_20170110_141532_.jpeg
这是onAcivityResult方法
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
try {
if ((requestCode == REQUEST_CODE_ATTACH_PHOTO ||
requestCode == REQUEST_CODE_TAKE_PHOTO)
&& resultCode == Activity.RESULT_OK) {
Uri selectedFileUri = (intent == null ? null : intent.getData());
File file = null;
if (selectedFileUri == null) {
selectedFileUri = ((ConversationActivity) fragmentActivity).getCapturedImageUri();
file = ((ConversationActivity) fragmentActivity).getFileObject();
}
if (selectedFileUri == null) {
Bitmap photo = (Bitmap) (intent != null ? intent.getExtras().get("data") : null);
selectedFileUri = ImageUtils.getImageUri(fragmentActivity, photo);
}
if (selectedFileUri != null) {
file = ((ConversationActivity) fragmentActivity).getFileObject();
}
getConversationFragment().loadFile(selectedFileUri, file);
Log.i(TAG, "File uri: " + selectedFileUri);
}
} catch (Exception e) {
}
}
这是我用来打开内容URI的方法,我有内容URI和文件要写
public void writeFile(Uri uri,File file) {
InputStream in = null;
OutputStream out = null;
try {
in = context.getContentResolver().openInputStream(uri);//I have context object
byte[] buffer = new byte[1024];
int bytesRead = -1;
out = new FileOutputStream(file);
while ((bytesRead = in.read(buffer)) != -1) { // here in.read(buffer)) is is always -1
out.write(buffer, 0, bytesRead);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (in != null && out != null) {
try {
out.flush();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
当我签入.read(buffer)中的日志时,在上面的writeFile方法中打开内容URI以写入创建的文件时,我遇到了一个问题,该文件总是返回-1
如何解决这个问题。
感谢您的任何帮助尝试
adb shell ls-l/storage/simulated/0/xyz/image/JPEG\u 20170110\u 141532\u.JPEG
?输出是什么?它给出了-rw rw---root sdcard\u rw 0 2017-01-10 14:15 JPEG\u 20170110\u 141532\u70110\u.JPEG所以文件的长度==0,这就是为什么in.read
返回-1in上述writeFile方法,我打开该内容uri,然后使用这个in=context.getContentResolver().openInputStream(uri)写入该文件;您要传递给writeFile
的Uri
是什么?
content://com.example.sample.provider/files/xyz/image/JPEG_20170110_141532_.jpeg
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
try {
if ((requestCode == REQUEST_CODE_ATTACH_PHOTO ||
requestCode == REQUEST_CODE_TAKE_PHOTO)
&& resultCode == Activity.RESULT_OK) {
Uri selectedFileUri = (intent == null ? null : intent.getData());
File file = null;
if (selectedFileUri == null) {
selectedFileUri = ((ConversationActivity) fragmentActivity).getCapturedImageUri();
file = ((ConversationActivity) fragmentActivity).getFileObject();
}
if (selectedFileUri == null) {
Bitmap photo = (Bitmap) (intent != null ? intent.getExtras().get("data") : null);
selectedFileUri = ImageUtils.getImageUri(fragmentActivity, photo);
}
if (selectedFileUri != null) {
file = ((ConversationActivity) fragmentActivity).getFileObject();
}
getConversationFragment().loadFile(selectedFileUri, file);
Log.i(TAG, "File uri: " + selectedFileUri);
}
} catch (Exception e) {
}
}
public void writeFile(Uri uri,File file) {
InputStream in = null;
OutputStream out = null;
try {
in = context.getContentResolver().openInputStream(uri);//I have context object
byte[] buffer = new byte[1024];
int bytesRead = -1;
out = new FileOutputStream(file);
while ((bytesRead = in.read(buffer)) != -1) { // here in.read(buffer)) is is always -1
out.write(buffer, 0, bytesRead);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (in != null && out != null) {
try {
out.flush();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}