2013-08-14 2 views
0

Android 갤러리를 사용하여 특정 폴더의 모든 사진을 열려고합니다. 나는 오래된 질문에 해결책을 찾았지만 효과가 없었습니다. 코드는 다음과 같습니다이 코드가 작동을 얻을 수 있지만, 난 당신이 날을 제안 다른 아이디어를 사용할 수 있는지갤러리의 폴더에서 사진 열기

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) 

그것은 괜찮을 것 :이 오류가있어이 코드

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; 
    } 
} 
} 

+0

1.'intent.setType ("image/*");'의도의 선언 다음에. 2. 조금이라도 읽으면 http://developer.android.com/reference/android/content/Intent.html#ACTION_GET_CONTENT 3. 매니페스트에서 활동을 선언하십시오. 4. 갤러리 이미지 유형은 무엇입니까? – g00dy

+0

당신은 "나는 안드로이드 갤러리를 사용하여 특정 폴더에서 모든 사진을 열어보고 싶다"라는 질문을 자세히 설명해 주시겠습니까? –

+0

MyAPP라는 폴더의 그림 만 갤러리를 열고 싶습니다. – Goblinch

답변

1
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
intent.setData(uri); 
startActivity(intent); 

위의 코드는 갤러리에서 그림을 여는 데 사용되지만 갤러리를 열려면 갤러리로 보내지 않아야합니다. 갤러리에서 폴더에있는 그림을보고 싶다면 How to open gallery to show images in a specific directory을 참조하십시오. 도움이되기를 바랍니다.

+0

저는 Intent.ACTION_GET_CONTENT를 사용해야한다는 것을 알고 있습니다. Intent.ACTION_VIEW가 사용해야합니다. – yugy

+0

같은 코드입니다 – Goblinch

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)를 사용하여 다음과 같이 당신은 당신의 응용 프로그램에이 선택한 이미지를 설정할 수 있습니다; 이 반환 결과는 활동이라고하고 우리는 코드의 두 번째 블록이 결과를 얻을 수 있으며, 세트는 당신의 이미지 뷰에서 이미지를 선택

+0

특정 폴더에있는 파일 만 표시하고 싶습니다. – Goblinch

1

여기에 실제 올바른 해결책 :

비밀이 폴더는 버킷/앨범을 찾아 내고는 로 대표된다. 버킷은 성공적인 MediaScan 이후에 나타나므로 위에 표시 할 이미지/비디오가 여러 번 위에 스캔 된 것처럼 스캔되었는지 확인하십시오.

의 난에 인덱스 폴더가 있다고 가정하자/SDCARD/MyApp를/myappsmediafolder : 이제 우리는 우리의 앨범 우리는 단순한 의도로 열 수 있습니다에 대한 bucketId을 가지고

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; 
    } 
} 

.

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 소스를보고이 사실을 알았습니다.

이 질문은 또한 다음과 같은 사본입니다 : Gallery with folder filter

관련 문제