Comment envelopper le contenu Uri avec un nio.ByteBuffer sur Android ?
-
21-12-2019 - |
Question
J'essaie de lire le contenu d'un Uri sur Android et j'ai besoin du type d'objet final transmis au SDK sous-jacent par un nio.ByteBuffer.
Je peux mettre la main sur un InputStream, via ContentResolver, mais je n'ai pas trouvé de moyen de l'envelopper avec un nio.ByteBuffer.
Existe-t-il un moyen de convertir un contenu Uri en nio.ByteBuffer sur Android ?
La solution
J'ai fini par télécharger le contenu de l'URI localement et ouvrez-le via une autre méthode pour obtenir le byTEBUFFER
Autres conseils
Supposons que vous travaillez sur une activité,
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;
}
Remarques:
(je) InputStream.read(byte[] b)
renverra un entier qui indique le nombre total d'octets lus dans le tableau d'octets b
à chaque fois.
(ii) Si InputStream.read(Byte[] b)
renvoie -1, cela indique que c'est la fin du inputStream.
(iii) arrSize
stocke le nombre total d'octets lus, c'est-à-direla longueur de byte[] b
(iv) ByteBuffer.wrap(byte[] b, int offset, int length)
encapsulera le tableau d'octets pour donner un ByteBuffer.Vous pouvez vérifier ceci référence
(v) ContentResolver.openInputStream(Uri uri)
et InputStream.read(byte[] b)
lancera IOException, vous devez donc le gérer.
(vi) Attention : IndexOutOfBoundException
pourrait arriver si arrSize
> MAX_SIZE
, vous devrez peut-être ajouter une clause if-else pour gérer ce problème.
N'hésitez pas à commenter ou à modifier le code s'il y a une erreur ou s'il existe un moyen plus rapide de le faire.Bon codage