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?

War es hilfreich?

Lösung

Ich habe den Inhalt des URI lokal heruntergeladen und über eine andere Methode geöffnet, um den Bytebuffer

zu erhalten

Andere 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top