Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用getContentResolver()打开文件提供程序内容Uri。openInputStream(Uri)始终在输入流中返回-1_Android_Xml_Uri_Android Fileprovider - Fatal编程技术网

Android 使用getContentResolver()打开文件提供程序内容Uri。openInputStream(Uri)始终在输入流中返回-1

Android 使用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

在android清单中,在应用程序标记中添加了FileProvider

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

        }
    }
}