web-dev-qa-db-ja.com

Androidファイルリソースのサイズを取得しますか?

リソースの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であることが常にわかります。何が間違っているのでしょうか。

22
Alex1987

リソースにFileを使用することはできません。 ResourcesまたはAssetManagerを使用してリソースにInputStreamを取得し、そのリソースでavailable()メソッドを呼び出します。

このような:

InputStream is = context.getResources().openRawResource(R.raw.nameOfFile);
int sizeOfInputStram = is.available(); // Get the size of the stream
12
EboMike

この行を試してください:

InputStream ins = context.getResources().openRawResource (R.raw.video)
int videoSize = ins.available();
22
Aleadam

これを試して:

AssetFileDescriptor sampleFD = getResources().openRawResourceFd(R.raw.video);
long size = sampleFD.getLength()
21
shem

answer by @ shem へのわずかな変化

AssetFileDescriptor afd = contentResolver.openAssetFileDescriptor(fileUri,"r");
long fileSize = afd.getLength();
afd.close();

ここで、fileUriのタイプはAndroid Uri

5
daka

再利用可能なKotlin拡張機能

これらは、コンテキストまたはアクティビティで呼び出すことができます。それらは例外安全です

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 
1
Gibolt