質問
次のコードを使用してアプリ内でギャラリーを開きます
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, FIND_RESULT);
画像のリストをカメラで撮影した画像のみを表示するように制限することはできますか?私の 2.1 システムでギャラリーを表示すると、画像がグループ化されているため、どのフォルダーに属するかを定義するパラメーターが必要です。
を確認する MediaStore.Images.ImageColumns そのようなことを定義するコラムは見つかりませんでした。
間違っているでしょうか?フォルダーごとにフィルターするクエリを作成し、独自のギャラリー ビューを作成できれば、問題は解決するからです。
解決
あなたは自分の活動にMediaScannerConnectionClientを実装する必要があり、その後、あなたはSCAN_PATHとして、ここでそのフォルダ名内のファイルの1の正確なパスを与える必要があり、それがそのフォルダに含まれるすべてのファイルをスキャンし、それが内部に組み込まれて開きます。ギャラリーインチだからあなたはフォルダの名前を与え、あなたがビデオを含む内のすべてのファイルを取得します。あなたは画像のみを開きたい場合はFILE_TYPE="image/*"
public class SlideShow extends Activity implements MediaScannerConnectionClient {
public String[] allFiles;
private String SCAN_PATH ;
private static final String FILE_TYPE = "*/*";
private MediaScannerConnection conn;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
File folder = new File("/sdcard/yourfoldername/");
allFiles = folder.list();
SCAN_PATH=Environment.getExternalStorageDirectory().toString()+"/yourfoldername/"+allFiles[0];
Button scanBtn = (Button) findViewById(R.id.scanBtn);
scanBtn.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
startScan();
}
});
}
private void startScan()
{
if(conn!=null)
{
conn.disconnect();
}
conn = new MediaScannerConnection(this, this);
conn.connect();
}
public void onMediaScannerConnected()
{
conn.scanFile(SCAN_PATH, FILE_TYPE);
}
public void onScanCompleted(String path, Uri uri)
{
try
{
if (uri != null)
{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
}
}
finally
{
conn.disconnect();
conn = null;
}
}
}
他のヒント
上記の回答は、正解としてマークされたものを含め、どれも正解ではありません。
実際の正しい解決策は次のとおりです。
秘密は、フォルダーが表されているバケット/アルバムを見つけることです。MediaScan が成功した後にバケットが表示されるため、表示したい画像やビデオが上記で複数回示されているように最初にスキャンされていることを確認してください。
/sdcard/myapp/ にインデックス付きフォルダーがあると仮定します。マイアプリメディアフォルダー:
String bucketId = "";
final String[] projection = new String[] {"DISTINCT " + MediaStore.Images.Media.BUCKET_DISPLAY_NAME + ", " + MediaStore.Images.Media.BUCKET_ID};
final Cursor cur = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);
while (cur != null && cur.moveToNext()) {
final String bucketName = cur.getString((cur.getColumnIndex(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME)));
if (bucketName.equals("myappsmediafolder")) {
bucketId = cur.getString((cur.getColumnIndex(MediaStore.Images.ImageColumns.BUCKET_ID)));
break;
}
}
アルバムのbucketIdを取得したので、単純なインテントでアルバムを開くことができます。
ビデオ ファイルのフィルタ:
Uri mediaUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
フィルター 画像ファイル:
Uri mediaUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
...
if (bucketId.length() > 0) {
mediaUri = mediaUri.buildUpon()
.authority("media")
.appendQueryParameter("bucketId", bucketId)
.build();
}
Intent intent = new Intent(Intent.ACTION_VIEW, mediaUri);
startActivity(intent);
組み込みのギャラリー アプリでこれが機能することを確認できます。Google フォトなどの他のアプリでは走行距離が異なる場合があります。
ギャラリー内でフィルターなしで特定のアルバムを選択できるにもかかわらず、画像やビデオをフィルターしない方法がまだわかりません。
これは、ギャラリー アプリの AOSP ソースを調べることでわかりました。
私はupvoteまたは彼の答えにコメントするのに十分な評判を持っていませんが、ShellDudeの答えは、あなたは、ギャラリーの意図にディレクトリURIを置くことができます。ギャラリーアプリを開いたときだから、代わりに1のすべての画像を表示します。
私にとっては、、上記の回答のように私のファイルをスキャンするには、仕事をしませんでした。 MediaStore.Images.Media.EXTERNAL_CONTENT_URIだけContentResolverのでMediaStore.Images.Media.DATAテーブルに新しい行を挿入した後働いた照会ます:
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, image.getPath());
values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg");
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
ここに簡素化です。
private MediaScannerConnection conn;
private void notifySystemWithImage(final File imageFile) {
conn = new MediaScannerConnection(this, new MediaScannerConnectionClient() {
@Override
public void onScanCompleted(String path, Uri uri) {
try {
if (uri != null) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "image/*");
startActivity(intent);
}
} finally {
conn.disconnect();
conn = null;
}
}
@Override
public void onMediaScannerConnected() {
conn.scanFile(imageFile.getAbsolutePath(), "*/*");
}
});
conn.connect();
}
あなたは、あなたの内側のアプリケーションフォルダのディレクトリを指定する必要があります。ていないユーザーのデフォルトルートであれば画像やすべてのもの。
public class SlideShow extends Activity implements MediaScannerConnectionClient {
public String[] allFiles;
private String SCAN_PATH ;
private static final String FILE_TYPE = "*/*";
private MediaScannerConnection conn;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
File folder = new File(HistoryActivity.this.getExternalFilesDir(null)+"/a/");
allFiles = folder.list();
SCAN_PATH= HistoryActivity.this.getExternalFilesDir(null)+"/a/"+allFiles[0];
Button scanBtn = (Button) findViewById(R.id.scanBtn);
scanBtn.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
startScan();
}
});
}
private void startScan()
{
if(conn!=null)
{
conn.disconnect();
}
conn = new MediaScannerConnection(this, this);
conn.connect();
}
public void onMediaScannerConnected()
{
conn.scanFile(SCAN_PATH, FILE_TYPE);
}
public void onScanCompleted(String path, Uri uri)
{
try
{
if (uri != null)
{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
}
}
finally
{
conn.disconnect();
conn = null;
}
}
}
は動作します...しかし、一つだけの写真を示しキットカット。 (画像を保存する際に、更新ギャラリー)私はと以前のバージョンのためにそれを修正するために管理します:
public void savePhoto(Bitmap bmp)
{
File imageFileFolder = new File(context.getExternalFilesDir(null)+"/a/") ;
imageFileFolder.mkdir();
FileOutputStream out = null;
Calendar c = Calendar.getInstance();
String date = fromInt(c.get(Calendar.MONTH))
+ fromInt(c.get(Calendar.DAY_OF_MONTH))
+ fromInt(c.get(Calendar.YEAR))
+ fromInt(c.get(Calendar.HOUR_OF_DAY))
+ fromInt(c.get(Calendar.MINUTE))
+ fromInt(c.get(Calendar.SECOND));
File imageFileName = new File(imageFileFolder, date.toString() + ".jpg");
try
{
out = new FileOutputStream(imageFileName);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
scanPhoto(imageFileName.toString());
out = null;
} catch (Exception e)
{
e.printStackTrace();
}
}
public String fromInt(int val)
{
return String.valueOf(val);
}
public void scanPhoto(final String imageFileName)
{
msConn = new MediaScannerConnection(context,new MediaScannerConnection.MediaScannerConnectionClient()
{
public void onMediaScannerConnected()
{
msConn.scanFile(imageFileName, null);
Log.i("msClient obj in Photo Utility", "connection established");
}
public void onScanCompleted(String path, Uri uri)
{
msConn.disconnect();
Log.i("msClient obj in Photo Utility","scan completed");
}
});
msConn.connect();
}