上記の質問に対する解決策を見つけました。
どうやら、特定のフォルダーのファイルがアプリに表示されないようにする簡単な方法があるようです...
私が以前に犯した間違いは、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.scanFile
。Environment.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 を返します。利用可能になったら、このメソッドを再度呼び出す必要があります。