ソースコードhereから、スキャナの最終的な実装には、オーディオファイルをスキャンする2つの手順があることがわかります。これらの2つのステップのいずれかが失敗すると、オーディオファイルはメディアプロバイダに挿入されません。
ステップ1ファイルの拡張子を確認し
static bool FileHasAcceptableExtension(const char *extension) {
static const char *kValidExtensions[] = {
".mp3", ".mp4", ".m4a", ".3gp", ".3gpp", ".3g2", ".3gpp2",
".mpeg", ".ogg", ".mid", ".smf", ".imy", ".wma", ".aac",
".wav", ".amr", ".midi", ".xmf", ".rtttl", ".rtx", ".ota",
".mkv", ".mka", ".webm", ".ts", ".fl", ".flac", ".mxmf",
".avi", ".mpeg", ".mpg"
};
static const size_t kNumValidExtensions =
sizeof(kValidExtensions)/sizeof(kValidExtensions[0]);
for (size_t i = 0; i < kNumValidExtensions; ++i) {
if (!strcasecmp(extension, kValidExtensions[i])) {
return true;
}
}
return false;
}
もっと拡張は、Android 5.0以降に追加されました。 opusコーデックの一般的なコンテナはogg
です。この拡張はAndroid 5.0より前です。オーディオファイルの拡張子がogg
であると仮定します。この手順ではスキャン処理は正常です。が渡された最初のステップの後のメタデータ
を取得
STEP2、スキャナは、後でデータベースの挿入のためのメディアのメタデータを取得する必要があります。私はスキャナがこの段階でコーデックレベルチェックをすると思う。
sp<MediaMetadataRetriever> mRetriever(new MediaMetadataRetriever);
int fd = open(path, O_RDONLY | O_LARGEFILE);
status_t status;
if (fd < 0) {
// couldn't open it locally, maybe the media server can?
status = mRetriever->setDataSource(path);
} else {
status = mRetriever->setDataSource(fd, 0, 0x7ffffffffffffffL);
close(fd);
}
if (status) {
return MEDIA_SCAN_RESULT_ERROR;
}
5.0より前のAndroidバージョンの場合、この手順でスキャナが失敗する可能性があります。ビルトインのopusコーデックサポートがないため、setDataSource
は最後に失敗します。メディアファイルはメディアプロバイダに最後に追加されません。我々は、手動でデータベース操作を行うことができますオーディオファイルが
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
に追加されます知っているので
は解決 を示唆しました。オーディオファイルとデータベース内の他のオーディオファイルとの整合性を維持するには、すべてのメタデータを自分で取得する必要があります。 opusファイルを再生できるので、メタデータを簡単に取得できます。
// retrieve more metadata, duration etc.
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Audio.AudioColumns.DATA, "/mnt/sdcard/Music/example.opus");
contentValues.put(MediaStore.Audio.AudioColumns.TITLE, "Example track");
contentValues.put(MediaStore.Audio.AudioColumns.DISPLAY_NAME, "example");
// more columns should be filled from here
Uri uri = getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, contentValues);
Log.d(TAG, uri.toString());
その後、あなたのアプリはオーディオファイルを見つけることができます。
getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI...
ありがとうございました。これは、私が世界中で私がオーパスにトランスコードしたすべてのオーディオファイルが音楽アプリに表示されなかった理由を知るのを助けました... – aross