1

コンテンツプロバイダーを使用してデバイス内のすべての音楽ファイルを取得し、リストに表示していますが、特定のフォルダー「X」のファイルをリストに表示したくありません。

私は現在、SDカードからすべてのオーディオファイルを取得するためにこれを使用しています。

private static final String[] EXTERNAL_COLUMNS = new String[] {
            MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DATA,
            MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST,
            MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.IS_RINGTONE,
            MediaStore.Audio.Media.IS_MUSIC,
            "\"" + MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + "\"" };

private Cursor getExternalAudioCursor(String selection,
            String[] selectionArgs) {
        return managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                EXTERNAL_COLUMNS, selection, selectionArgs,
                MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
    }

Cursor c = new MergeCursor(new Cursor[] {
            getExternalAudioCursor(selection, argsArray)};

また、Androidドキュメントから、私はこれを読みました...

public static final String MEDIA_IGNORE_FILENAME

以来:APIレベル9含まれているディレクトリとそのサブディレクトリ内のメディアを無視するようにメディアスキャナーに通知するファイルの名前。開発者はこれを使用して、アプリケーションのグラフィックがギャラリーに表示されないようにし、同様にアプリケーションのサウンドと音楽がミュージックアプリに表示されないようにする必要があります。定数値:"。nomedia"

しかし、事前にファイル名がわからないため、ファイル名を特定することはできません。

だから私の質問は、フォルダで同じようなことをして、そのすべてのコンテンツが私のリストに表示されないようにすることはできますか?

そうでない場合、私がこれを行うことができる他の方法はありますか?

4

3 に答える 3

1

そのフォルダーに .nomedia ファイルを追加することもできますが、それは実際にはプログラムによる解決策ではなく、おそらく SDCARD でしか実行できません。

残念ながら、これにより、他のメディア スキャン アプリケーションがそのフォルダーからファイルを取得することもできなくなります。他に何もない場合は、追加してスキャンし、削除することができます. しかし、それは本当に醜い/ハッキーなソリューションです。

http://lifehacker.com/5793803/disable-media-scanning-in-specific-android-directories-by-creating-a-nomedia-file

編集:どうやら、ピリオドで始まるフォルダーはシステムに対して非表示になります。繰り返しますが、それは最善のアイデアとは思えません。

ディレクトリを一時的に変更する/.nomedia ファイルを追加し、スキャンしてから削除するという前提は、それほど悪いことではないように思えますが、ファイル/フォルダーを元に戻す前にアプリがクラッシュした場合はどうなるでしょうか。州?アプリケーションが私のディレクトリを変更し、他のアプリケーションが (おそらく) 適切に機能しなくなった場合、私はかなり動揺したユーザーになるでしょう。

これらのソリューションは、開発者ではなく消費者/ユーザーを対象としているようです。

于 2012-05-09T13:29:10.257 に答える
1

.nomediaファイルをフォルダーに入れることで、画像ファイルがシステムによってインデックス付けされるのを防ぐことができました。

このリンクによると、音楽ファイルでも機能するはずです。たぶん、このテクニックはあなたを正しい方向に導くことができます...

(平文のリンク: http://androinica.com/2009/08/how-to-hide-non-music-audio-files-from-appearing-in-android-media-players/ )

于 2012-05-09T13:23:08.573 に答える
0

上記の質問に対する解決策を見つけました。

どうやら、特定のフォルダーのファイルがアプリに表示されないようにする簡単な方法があるようです...

私が以前に犯した間違いは、Environment.getExternalStorageDirectory();すべてのアプリ ファイルを直接 SD カードに書き込んでいて、リストに表示されていたことです。

使用する必要がContext.getExternalFilesDir("FolderName");あり、ファイルがリストに表示されなくなりました。これは、フォルダーがアプリに対してローカルになり、メディアからアクセスできないためです。

この getExternalFilesDir の完全な Java ドキュメントを読んで、クラスを理解してください。

public File getExternalFilesDir(文字列型)

以降: API レベル 8

アプリケーションが所有する永続ファイルを配置できる外部ファイルシステム (Environment.getExternalStorageDirectory() のどこかにある) 上のディレクトリへの絶対パスを返します。これらのファイルはアプリケーション専用であり、通常、ユーザーにはメディアとして表示されません。

これは、アプリケーションがアンインストールされるとこれらのファイルが削除されるという点で getFilesDir() に似ていますが、重要な違いがいくつかあります。

外部ファイルは常に利用できるとは限りません。ユーザーが外部ストレージをコンピューターにマウントしたり削除したりすると、外部ファイルは消えます。ストレージ状態の情報については、環境の API を参照してください。これらのファイルに適用されるセキュリティはありません。すべてのアプリケーションは、ここに配置されたファイルを読み書きできます。アプリケーションのプライベート ストレージ内のファイルを操作する典型的なコードの例を次に示します。

void createExternalStoragePrivateFile() {
    // Create a path where we will place our private file on external
    // storage.
    File file = new File(getExternalFilesDir(null), "DemoFile.jpg");

try {
    // Very simple code to copy a picture from the application's
    // resource into the external file.  Note that this code does
    // no error checking, and assumes the picture is small (does not
    // try to copy it in chunks).  Note that if external storage is
    // not currently mounted this will silently fail.
    InputStream is = getResources().openRawResource(R.drawable.balloons);
    OutputStream os = new FileOutputStream(file);
    byte[] data = new byte[is.available()];
    is.read(data);
    os.write(data);
    is.close();
    os.close();
} catch (IOException e) {
    // Unable to create file, likely because external storage is
    // not currently mounted.
    Log.w("ExternalStorage", "Error writing " + file, e);
}
}

void deleteExternalStoragePrivateFile() {
    // Get path for the file on external storage.  If external
    // storage is not currently mounted this will fail.
    File file = new File(getExternalFilesDir(null), "DemoFile.jpg");
    if (file != null) {
        file.delete();
    }
}

boolean hasExternalStoragePrivateFile() {
    // Get path for the file on external storage.  If external
    // storage is not currently mounted this will fail.
    File file = new File(getExternalFilesDir(null), "DemoFile.jpg");
    if (file != null) {
        return file.exists();
    }
    return false;
}

この関数に null 以外の型を指定すると、返されるファイルは、指定された型のサブディレクトリへのパスになります。これらのファイルはメディア スキャナによって自動的にスキャンされませんが、 を使用して明示的にメディア データベースに追加できますMediaScannerConnection.scanFileEnvironment.getExternalStoragePublicDirectory()これは、すべてのアプリケーションで共有されるメディアのディレクトリを提供すると同じではないことに注意してください。ここで返されるディレクトリはアプリケーションが所有しており、その内容はアプリケーションがアンインストールされると削除されます。Environment.getExternalStoragePublicDirectory() とは異なり、ここで返されるディレクトリは自動的に作成されます。

以下は、アプリケーションのプライベート ストレージ内の画像を操作し、メディア データベースに追加する典型的なコードの例です。

void createExternalStoragePrivatePicture() {
    // Create a path where we will place our picture in our own private
    // pictures directory.  Note that we don't really need to place a
    // picture in DIRECTORY_PICTURES, since the media scanner will see
    // all media in these directories; this may be useful with other
    // media types such as DIRECTORY_MUSIC however to help it classify
    // your media for display to the user.
    File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File file = new File(path, "DemoPicture.jpg");
try {
    // Very simple code to copy a picture from the application's
    // resource into the external file.  Note that this code does
    // no error checking, and assumes the picture is small (does not
    // try to copy it in chunks).  Note that if external storage is
    // not currently mounted this will silently fail.
    InputStream is = getResources().openRawResource(R.drawable.balloons);
    OutputStream os = new FileOutputStream(file);
    byte[] data = new byte[is.available()];
    is.read(data);
    os.write(data);
    is.close();
    os.close();

    // Tell the media scanner about the new file so that it is
    // immediately available to the user.
    MediaScannerConnection.scanFile(this,
            new String[] { file.toString() }, null,
            new MediaScannerConnection.OnScanCompletedListener() {
        public void onScanCompleted(String path, Uri uri) {
            Log.i("ExternalStorage", "Scanned " + path + ":");
            Log.i("ExternalStorage", "-> uri=" + uri);
        }
    });
} catch (IOException e) {
    // Unable to create file, likely because external storage is
    // not currently mounted.
    Log.w("ExternalStorage", "Error writing " + file, e);
}
}

void deleteExternalStoragePrivatePicture() {
    // Create a path where we will place our picture in the user's
    // public pictures directory and delete the file.  If external
    // storage is not currently mounted this will fail.
    File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    if (path != null) {
        File file = new File(path, "DemoPicture.jpg");
        file.delete();
    }
}

boolean hasExternalStoragePrivatePicture() {
    // Create a path where we will place our picture in the user's
    // public pictures directory and check if the file exists.  If
    // external storage is not currently mounted this will think the
    // picture doesn't exist.
    File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    if (path != null) {
        File file = new File(path, "DemoPicture.jpg");
        return file.exists();
    }
    return false;
}

パラメータ type 返されるファイル ディレクトリのタイプ。ファイル ディレクトリのルートまたはサブディレクトリの次の環境定数のいずれかの場合は null の場合があります。

戻り値 外部ストレージ上のアプリケーション ファイルを保持するディレクトリのパスを返します。外部ストレージが現在マウントされていないため、パスが存在することを確認できなかった場合は null を返します。利用可能になったら、このメソッドを再度呼び出す必要があります。

于 2012-05-29T11:03:37.937 に答える