은폐 된 데이터의 해독에 문제가 있습니다. 스트리밍을 제대로 끝낼 수없는 것 같습니다. conceal에 문제가있는 것처럼 보이기 때문에 proxyStream (암호화 부분 만)을 전환하여 숨김을 실행하지 않기 때문에 모든 것이 예상대로 작동합니다. 나는 또한 쓰기가 괜찮다고 가정하고 예외는 없으며 디스크에 암호화 된 파일을 찾을 수 있습니다.facebook 은폐 라이브러리에 대한 문제
다른 앱이 사용자가 원할 때 해독 된 데이터를 읽을 수 있도록 contentprovider를 통해 내 데이터를 프록시 처리합니다. (공유, ...) 내 콘텐츠 제공 업체에서
내가 contentResolvers 내가 페이스 북 응용 프로그램 페이스 북 안드로이드 팀에서 추측
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
try {
ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
String name = uri.getLastPathSegment();
File file = new File(name);
InputStream fileContents = mStorageProxy.getDecryptInputStream(file);
ParcelFileDescriptor.AutoCloseOutputStream stream = new ParcelFileDescriptor.AutoCloseOutputStream(pipe[1]);
PipeThread pipeThread = new PipeThread(fileContents, stream);
pipeThread.start();
return pipe[0];
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
이 표준을 사용하여 오히려이 될 수있는 데이터를 읽을 수 있도록 openFile 방법을 사용하고 있습니다 query()
바이트 배열을 가진 MediaStore.MediaColumns()
으로 전송되는 방법은 나를 위해 적합하지 않습니다. 왜냐하면 나는 미디어 파일을 암호화 할뿐만 아니라 스트림의 접근법을 더 좋아하기 때문입니다.
내가 Inpustream에서 읽는 방법입니다. 이것은 기본적으로 두 개의 parcelFileDescriptors 사이의 파이프입니다. inputstream은 은폐에서 왔고 원래는 BufferedInputStream으로 래핑 된 FileInputstream입니다.
static class PipeThread extends Thread {
InputStream input;
OutputStream out;
PipeThread(InputStream inputStream, OutputStream out) {
this.input=inputStream;
this.out=out;
}
@Override
public void run() {
byte[] buf=new byte[1024];
int len;
try {
while ((len=input.read(buf)) > 0) {
out.write(buf, 0, len);
}
input.close();
out.flush();
out.close();
}
catch (IOException e) {
Log.e(getClass().getSimpleName(),
"Exception transferring file", e);
}
}
}
다른 방법으로 스트림을 읽으려고 했으므로 정말 문제가되지 않습니다.
마침내 나는 끊임없이 끝내고있다. 문제가 무엇인지 아십니까? 내가 길을 잃은 적이 있는데 기본 통화를 가리키는 ..
Exception transferring file
com.facebook.crypto.cipher.NativeGCMCipherException: decryptFinal
at com.facebook.crypto.cipher.NativeGCMCipher.decryptFinal(NativeGCMCipher.java:108)
at com.facebook.crypto.streams.NativeGCMCipherInputStream.ensureTagValid(NativeGCMCipherInputStream.java:126)
at com.facebook.crypto.streams.NativeGCMCipherInputStream.read(NativeGCMCipherInputStream.java:91)
at com.facebook.crypto.streams.NativeGCMCipherInputStream.read(NativeGCMCipherInputStream.java:76)
편집 : 이 스트림이 확인 작업처럼 보이지만, 무엇을 실패하면 읽는의 마지막 반복이다. 버퍼를 사용함에 따라 버퍼가 더 크면 데이터를 remaiming하는 것이 문제의 원인입니다. 나는 은폐의 근원을 조사해 왔으며, 거기에 대해서는이 점에서 괜찮은 것으로 보인다. 네이티브 레이어의 어딘가에서 실패하지 않았습니까? 참고 : 바이트의 최종 청크를 제외하고 암호 해독 된 파일을 가져 왔습니다. 따라서 예를 들어 불완전한 이미지 파일 (마지막 수천 개의 픽셀이 표시되지 않음)이 있습니다.
실제로 파일을 쓰는 코드를보고 싶습니다. '동안 ((LEN = input.read (BUF))> 0) {}' 가 스트림으로부터 판독하는 올바른 방법이 아니라 '동안 ((LEN = input.read (buf))! = -1) {}'' 스트림의 마지막 반복은 파일의 무결성을 검사하기 때문에 중요하므로 무시하지 않아야합니다. – user868459
이 예외는 일반적으로 작성된 파일과 읽은 파일간에 불일치가있을 때 발생합니다. 즉 실제로 파일을 변경하는 경우 또는 잘못된 파일을 읽은 경우입니다. 이것은 보안 예외이므로 storageProxy와 작성 코드의 impl에 대해 궁금합니다. – user868459
사실 나는 거기서 문제를 찾고 있었지만, 슬프게도 이것은 내 문제의 근원이 아닙니다. 이전에 조언 한 코드를 사용하려고했지만 여전히 작동하지 않습니다. 나는 의심하기 시작했습니다. 내 코드가 완전히 끝났으며'ByteStreams.copy (input, out); '을 사용하려고했습니다. 동일한 예외가 있습니다 .. – simekadam