So verpacken Sie Uri-Inhalte mit einem nio.ByteBuffer auf Android?
-
21-12-2019 - |
Frage
Ich versuche, Inhalte von einem Uri unter Android zu lesen, und ich benötige den endgültigen Objekttyp, der von einem nio an das zugrunde liegende SDK übergeben wird.ByteBuffer.
Ich kann einen InputStream über ContentResolver in die Hände bekommen, habe aber keine Möglichkeit gefunden, ihn mit einem nio zu verpacken.ByteBuffer.
Gibt es eine Möglichkeit, einen Uri-Inhalt in einen nio zu konvertieren.ByteBuffer auf Android?
Lösung
Ich habe den Inhalt des URI lokal heruntergeladen und über eine andere Methode geöffnet, um den Bytebuffer
zu erhaltenAndere Tipps
Angenommen, Sie arbeiten an einer Aktivität,
private ByteBuffer getByteBuffer(Uri uri){
try{
InputStream iStream = getContentResolver().openInputStream(uri);
if(iStream!=null){
//value of MAX_SIZE is up to your requirement
final int MAX_SIZE = 5000000;
byte[] byteArr = new byte[MAX_SIZE];
int arrSize = 0;
while(true){
int value = iStream.read(byteArr);
if(value == -1){
break;
}else{
arrSize += value;
}
}
iStream.close();
return ByteBuffer.wrap(byteArr, 0, arrSize);
}
}catch(IOException e){
//do something
}
return null;
}
Notes:
(ich) InputStream.read(byte[] b)
gibt eine Ganzzahl zurück, die die Gesamtzahl der in das Byte-Array gelesenen Bytes angibt b
zu jeder Zeit.
(ii) Wenn InputStream.read(Byte[] b)
gibt -1 zurück, es zeigt an, dass es das Ende des Eingabestreams ist.
(III) arrSize
speichert die Gesamtzahl der gelesenen Bytes, d. h.die länge von byte[] b
(IV) ByteBuffer.wrap(byte[] b, int offset, int length)
umschließt das Byte-Array, um einen ByteBuffer zu erhalten.Sie können dies überprüfen Referenz
(V) ContentResolver.openInputStream(Uri uri)
und InputStream.read(byte[] b)
wird IOException auslösen, also müssen Sie damit umgehen.
(vi) Vorsicht: IndexOutOfBoundException
könnte passieren, wenn arrSize
> MAX_SIZE
, müssen Sie möglicherweise eine if-else-Klausel hinzufügen, um ein solches Problem zu behandeln.
Bitte zögern Sie nicht, den Code zu kommentieren oder zu ändern, wenn ein Fehler vorliegt oder wenn es einen schnelleren Weg gibt, dies zu tun.Glückliche Codierung