2016-04-13 31 views
10

オンラインで曲をダウンロードしてMediaStoreに追加できる音楽プレーヤーを作成したいと思います。 Download Managerを使用していて、ダウンロードが完了したらMediaScannerでこのファイルをスキャンできます。曲をMediastoreに曲を追加するには

DownloadManager.Request request .... 
request.allowScanningByMediaScanner(); 
... 
downloadManager.enqueue(request); 

アンドロイド5.0以上で動作します。
しかし、この曲は、ロリポップバージョンの下のアンドロイドでサポートされていないコーデック(opus)を使用してダウンロードされています。したがって、MediaScannerはこのファイルをMediaStoreに追加しません。

私のアプリでは、opusコーデックを再生できますが、ダウンロードした後にMediaStoreにその曲が存在しないため、私のアプリはこの曲を見つけることができません。

強制的にMediaScore.Audioにダウンロードしたファイルを音楽トラックとして追加する方法。場合は、ダウンロードが完了した後、どのように私は、マニュアルMediaStore.Audioにこの曲を追加することができません。

public class BroadcastDownloadComplete extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals("android.intent.action.DOWNLOAD_COMPLETE")) { 

      //addSongToMediaStore(intent); 
     } 
    } 
} 

答えて

3

ソースコード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... 
+0

ありがとうございました。これは、私が世界中で私がオーパスにトランスコードしたすべてのオーディオファイルが音楽アプリに表示されなかった理由を知るのを助けました... – aross

2

あなたはメディアとして含まれるファイルをスキャンするには、Androidを依頼するMediaScannerConnectionを使用することができます。 scanFile()静的メソッドを使用します。

関連する問題