0

Android ギャラリーを使用して、特定のフォルダーからすべての写真を開きたいです。古い質問で解決策を見つけましたが、うまくいきませんでした。コードは次のとおりです。

public class MainActivity extends Activity implements MediaScannerConnectionClient {

public String[] allFiles;
private String SCAN_PATH;
private static final String FILE_TYPE = "image/*";
private MediaScannerConnection conn;
private String folderName = "MyAPP";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.album);

    File folder = new File("/sdcard/"+folderName+"/");
    allFiles = folder.list();

    SCAN_PATH = Environment.getExternalStorageDirectory().toString()
            + "/"+folderName+"/" + allFiles[0];

    Button scanBtn = (Button) findViewById(R.id.button1);
    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_GET_CONTENT);
            intent.setData(uri);
            startActivity(intent);
        }
    } finally {
        conn.disconnect();
        conn = null;
    }
}
}

このコードでは、次のエラーが発生します。

08-14 11:09:20.093: W/ContentResolver(25151): Failed to get type for: content://media/external/images/media/10471 (Unknown URL : content://media/external/images/media/10471)
08-14 11:09:20.093: E/JavaBinder(25151): *** Uncaught remote exception!  (Exceptions are not yet supported across processes.)
08-14 11:09:20.093: E/JavaBinder(25151): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.GET_CONTENT dat=content://media/external/images/media/10471 }
08-14 11:09:20.093: E/JavaBinder(25151):    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1545)
08-14 11:09:20.093: E/JavaBinder(25151):    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1416)
08-14 11:09:20.093: E/JavaBinder(25151):    at android.app.Activity.startActivityForResult(Activity.java:3351)
08-14 11:09:20.093: E/JavaBinder(25151):    at android.app.Activity.startActivityForResult(Activity.java:3312)
08-14 11:09:20.093: E/JavaBinder(25151):    at android.app.Activity.startActivity(Activity.java:3522)
08-14 11:09:20.093: E/JavaBinder(25151):    at android.app.Activity.startActivity(Activity.java:3490)
08-14 11:09:20.093: E/JavaBinder(25151):    at com.example.camtest.MainActivity.onScanCompleted(MainActivity.java:64)
08-14 11:09:20.093: E/JavaBinder(25151):    at android.media.MediaScannerConnection$1.scanCompleted(MediaScannerConnection.java:53)
08-14 11:09:20.093: E/JavaBinder(25151):    at android.media.IMediaScannerListener$Stub.onTransact(IMediaScannerListener.java:60)
08-14 11:09:20.093: E/JavaBinder(25151):    at android.os.Binder.execTransact(Binder.java:367)
08-14 11:09:20.093: E/JavaBinder(25151):    at dalvik.system.NativeStart.run(Native Method)

このコードを機能させることができれば問題ありませんが、提案された他のアイデアを使用できます

4

4 に答える 4

1

実際の正しい解決策は次のとおりです。

秘密は、フォルダーが表されているバケット/アルバムを見つけることです。バケットは MediaScan が成功した後に表示されるため、表示したい画像/ビデオが最初に上記のように複数回スキャンされていることを確認してください。

/sdcard/myapp/ myappsmediafolderにインデックス付きフォルダーがあるとします。

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 ソースを見て、これを理解しました。

この質問は次の複製でもあります:フォルダー フィルターを使用したギャラリー

于 2016-02-14T20:05:46.700 に答える
1
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setData(uri);
startActivity(intent);

上記のコードは、ギャラリーで画像を開くためのものですが、ギャラリーに uri を渡して開くことはありません。ギャラリーごとにフォルダー内の写真を表示したい場合は、ギャラリーを開いて特定のディレクトリ内の画像を表示する方法を紹介します。

于 2013-08-14T09:29:39.433 に答える
0

ボタンクリックでこれを試してください

 browse.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

     Intent i = new Intent(
             Intent.ACTION_PICK,
             android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

             startActivityForResult(i, RESULT_LOAD_IMAGE);

}

});

この選択した画像を次のようにアプリケーションに設定できます

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
        Uri selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        picturePath = cursor.getString(columnIndex);
        cursor.close();

         imageView = (ImageView) findViewById(R.id.property_image);
        imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));

   }}

コードの最初のブロックでは、startActivityForResult(i, RESULT_LOAD_IMAGE); を使用します。これは呼び出されたアクティビティに結果を返し、2 番目のコード ブロックでこの結果を取得し、ImageView で選択した画像を設定できます。

于 2013-08-14T09:37:29.933 に答える