リソースのrawフォルダーにビデオファイルがあります。ファイルのサイズを知りたいのですが。私はこのコードを持っています:
Uri filePath = Uri.parse("Android.resource://com.Android.FileTransfer/" + R.raw.video);
File videoFile = new File(filePath.getPath());
Log.v("LOG", "FILE SIZE "+videoFile.length());
しかし、サイズが0であることが常にわかります。何が間違っているのでしょうか。
リソースにFile
を使用することはできません。 Resources
またはAssetManager
を使用してリソースにInputStream
を取得し、そのリソースでavailable()
メソッドを呼び出します。
このような:
InputStream is = context.getResources().openRawResource(R.raw.nameOfFile);
int sizeOfInputStram = is.available(); // Get the size of the stream
この行を試してください:
InputStream ins = context.getResources().openRawResource (R.raw.video)
int videoSize = ins.available();
これを試して:
AssetFileDescriptor sampleFD = getResources().openRawResourceFd(R.raw.video);
long size = sampleFD.getLength()
これらは、コンテキストまたはアクティビティで呼び出すことができます。それらは例外安全です
fun Context.assetSize(resourceId: Int): Long =
try {
resources.openRawResourceFd(resourceId).length
} catch (e: Resources.NotFoundException) {
0
}
これは最初のものほど良くはありませんが、場合によっては必要になるかもしれません
fun Context.assetSize(resourceUri: Uri): Long {
try {
val descriptor = contentResolver.openAssetFileDescriptor(resourceUri, "r")
val size = descriptor?.length ?: return 0
descriptor.close()
return size
} catch (e: Resources.NotFoundException) {
return 0
}
}
別のバイト表現を取得する簡単な方法が必要な場合は、これらを使用できます
val Long.asKb get() = this.toFloat() / 1024
val Long.asMb get() = asKb / 1024
val Long.asGb get() = asMb / 1024