갤러리에서 안드로이드 선택 이미지


196

갤러리에서 사진 선택기를 만들고 싶습니다. 나는 코드를 사용한다

 intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
 startActivityForResult(intent, TFRequestCodes.GALLERY);

내 문제는이 활동에서 비디오 파일이 표시된다는 것입니다. 이 활동에서 비디오 파일이 표시되지 않도록 표시된 파일을 필터링하는 방법이 있습니까?


3
이 기사는 갤러리에서 이미지를 선택하는 방법을 잘 설명합니다 : androidbitmaps.blogspot.com/2015/04/…
Andy Res

당신과 비슷한 질문이 있습니다. stackoverflow.com/a/31382240/1835650
TeeTracker

답변:


344

물론. 이 시도:

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);

상수 PICK_IMAGE 를 작성하는 것을 잊지 마십시오 . 사용자가 이미지 갤러리 활동에서 언제 돌아 왔는지 인식 할 수 있습니다.

public static final int PICK_IMAGE = 1;

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (requestCode == PICK_IMAGE) {
        //TODO: action
    }
}

그것이 이미지 갤러리라고 부르는 방법입니다. 그것을 넣어 당신을 위해 작동하는지 확인하십시오.

편집하다:

문서 앱이 나타납니다. 사용자가 설치했을 수있는 갤러리 응용 프로그램도 사용할 수 있도록하려면 :

    Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
    getIntent.setType("image/*");

    Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    pickIntent.setType("image/*");

    Intent chooserIntent = Intent.createChooser(getIntent, "Select Image");
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent});

    startActivityForResult(chooserIntent, PICK_IMAGE);

6
이 "Android 시스템", "문서"에 2 가지 옵션이 있습니다. Android 시스템을 선택하면 갤러리 및 사진이 표시됩니다. 이 중간 옵션 목록을 제거하려면 어떻게합니까?
Uday December

4
@Uday는 단순히 기본값을 설정하지 않았기 때문입니다. 그냥 남겨주세요 :)
Tristan Wiley

13
PICK_IMAGE 상수는 무엇으로 설정되어야합니까? "PICK_IMAGE"기호를 해결할 수 없음
Michael

3
@Michael PICK_IMAGE 상수는 이 클래스에서 결정한 정적 int 값을 보유 합니다.이 @Override함수 는 함수 onActivityResult(int requestCode, resultCode, Intent data)에서 더 사용됩니다. 이 상수를 사용 requestCode하여 조치를 수행하기 전에 매개 변수 를 확인하는 것이 좋습니다.)
Gabriel Checchia Vitali

다음 코드를 사용하여 onActivityResult (...) 메소드에서 비트 맵을 검색 할 수 있습니다 (RESULT_OK 가정). 비트 맵 bitmap = data.getExtras (). getParcelable ( "data");
Shn_Android_Dev

196

때때로, 당신은 당신이 선택한 사진에서 파일을 얻을 수 없습니다. 선택한 항목이 Google+, 드라이브, Dropbox 또는 다른 제공 업체에서 제공 되었기 때문입니다.

가장 좋은 해결책은 시스템에 Intent.ACTION_GET_CONTENT 를 통해 컨텐츠를 선택 하고 컨텐츠 제공자에게 결과를 가져 오도록 요청하는 것입니다.

아래 코드를 따르거나 업데이트 된 요점을 볼 수 있습니다 .

public void pickImage() {
  Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  intent.setType("image/*");
  startActivityForResult(intent, PICK_PHOTO_FOR_AVATAR);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_PHOTO_FOR_AVATAR && resultCode == Activity.RESULT_OK) {
        if (data == null) {
            //Display an error
            return;
        }
        InputStream inputStream = context.getContentResolver().openInputStream(data.getData());
        //Now you can do whatever you want with your inpustream, save it as file, upload to a server, decode a bitmap...
    }
}

14
if(resultCode == Activity.RESULT_OK) {...}취소 / 성공을 감지하는 데 사용할 수 있습니다
Thamme Gowda

어떻게 경로를 얻을 수 있습니까?
10

@delive, 나는 당신이 시도 할 수 있다고 생각 new File(data.getData()).getAbsolutePath()그냥 추측, 나는 그것을 시도하지 않았다
누군가 어딘가에

1
의 조각에서 안드로이드 스튜디오에 의해 FileNotFound 예외 경고 getActivity().getContentResolver().openInputStream(data.getData());.
Iqbal

1
파일 경로가 반환되지 않는 특정 장치에서 작동합니다. 그러나 일단 InputStream이 있으면 이미지의 방향을 결정하는 방법을 결정할 방법이 없습니다.
Casey Perkins

30
public void FromCamera() {

    Log.i("camera", "startCameraActivity()");
    File file = new File(path);
    Uri outputFileUri = Uri.fromFile(file);
    Intent intent = new Intent(
            android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
    startActivityForResult(intent, 1);

}

public void FromCard() {
    Intent i = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(i, 2);
}

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

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 2 && 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]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

        bitmap = BitmapFactory.decodeFile(picturePath);
        image.setImageBitmap(bitmap);

        if (bitmap != null) {
            ImageView rotate = (ImageView) findViewById(R.id.rotate);

        }

    } else {

        Log.i("SonaSys", "resultCode: " + resultCode);
        switch (resultCode) {
        case 0:
            Log.i("SonaSys", "User cancelled");
            break;
        case -1:
            onPhotoTaken();
            break;

        }

    }

}

protected void onPhotoTaken() {
    // Log message
    Log.i("SonaSys", "onPhotoTaken");
    taken = true;
    imgCapFlag = true;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 4;
    bitmap = BitmapFactory.decodeFile(path, options);
    image.setImageBitmap(bitmap);


}

대단히 감사합니다. 이 답변이 날 이후에 이미지를 업로드 도움이
로사리오 페레 페르난데스

OnActivityResult의 스위치에서 case -1 대신 case 1을 의미한다고 생각합니다.
Mathias

나는 그것이 새로운 질문이라는 것을 알고 있지만 왜 우리가 그림 경로를 얻기 위해이 모든 것을 했습니까? data.getData는 무엇을 반환합니까?
moumenShobakey

의 가치는 path무엇입니까? 에File file = new File(path);
라비 Vaniya

23

이 방법을 사용하여 갤러리에서 이미지를 선택할 수 있습니다. 이미지 만 표시됩니다.

public void pickImage() {
    Intent intent = new Intent(Intent.ACTION_PICK,
            MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    intent.setType("image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("scale", true);
    intent.putExtra("outputX", 256);
    intent.putExtra("outputY", 256);
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, 1);
}

onActivityResult를 다음과 같이 재정의하십시오.

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == 1) {
            final Bundle extras = data.getExtras();
            if (extras != null) {
                //Get image
                Bitmap newProfilePic = extras.getParcelable("data");
            }
        }
    }

2
@Abhishek ... ACTION_PICK 인 텐트에 허용되는 엑스트라 목록은 어디에서 찾습니까? 감사!
Johnny Wu

1
API 레벨 23 이상의 경우 READ_EXTERNAL_STORAGE 및 WRITE_EXTERNAL_STORAGE에 대한 런타임 권한을 추가하는 것을 잊지 마십시오. 그렇지 않으면 갤러리에서 비트 맵을 null이 아닌 것으로 얻을 수 없습니다. 참조 stackoverflow.com/a/35285667/3341089을
oguzhan

1
URI를 설정 한 후 setType을 호출하면 데이터가 지워집니다.
Taslim Oseni

11

다음은 요청 권한에 대한 전체 예입니다 (필요한 경우). 갤러리에서 이미지를 선택한 다음 이미지를 bitmap또는file

AndroidManifesh.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

활동

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button_pick_image.setOnClickListener {
            pickImage()
        }
    }

    private fun pickImage() {
        if (ActivityCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            val intent = Intent(
                Intent.ACTION_PICK,
                MediaStore.Images.Media.INTERNAL_CONTENT_URI
            )
            intent.type = "image/*"
            intent.putExtra("crop", "true")
            intent.putExtra("scale", true)
            intent.putExtra("aspectX", 16)
            intent.putExtra("aspectY", 9)
            startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)
        } else {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                READ_EXTERNAL_STORAGE_REQUEST_CODE
            )
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == PICK_IMAGE_REQUEST_CODE) {
            if (resultCode != Activity.RESULT_OK) {
                return
            }
            val uri = data?.data
            if (uri != null) {
                val imageFile = uriToImageFile(uri)
                // todo do something with file
            }
            if (uri != null) {
                val imageBitmap = uriToBitmap(uri)
                // todo do something with bitmap
            }
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            READ_EXTERNAL_STORAGE_REQUEST_CODE -> {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // pick image after request permission success
                    pickImage()
                }
            }
        }
    }

    private fun uriToImageFile(uri: Uri): File? {
        val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
        val cursor = contentResolver.query(uri, filePathColumn, null, null, null)
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                val columnIndex = cursor.getColumnIndex(filePathColumn[0])
                val filePath = cursor.getString(columnIndex)
                cursor.close()
                return File(filePath)
            }
            cursor.close()
        }
        return null
    }

    private fun uriToBitmap(uri: Uri): Bitmap {
        return MediaStore.Images.Media.getBitmap(this.contentResolver, uri)
    }

    companion object {
        const val PICK_IMAGE_REQUEST_CODE = 1000
        const val READ_EXTERNAL_STORAGE_REQUEST_CODE = 1001
    }
}

데모
https://github.com/PhanVanLinh/AndroidPickImage


자르기 및 종횡비 기능이있는 라이브러리에 불과합니다. 나는 그런 것이 존재한다는 것을 결코 알지 못했습니다. 정말로 감사합니다.
Lalit Fauzdar

1
여기로 돌아가서, 첫 인상을보고 싶을만큼 좋지 않습니다. 스냅 시드로 편집 할 때 이미지를 선택하지 않고 충돌이 없지만 이미지가 없습니다. 화웨이의 기본 갤러리 앱은 편집 후 다음을 클릭 할 때 아무것도하지 않습니다 .Google 사진에서 선택할 때 이미지를 편집하지 않고 다시 가져옵니다. 직접하지 않고. 화웨이의 기본 갤러리와 Google 사진을 선택하여 편집하는 경우에만 효과적입니다.
Lalit Fauzdar


1

문서 당 API min 19를 가진 사람들에게 답변에 대한 업데이트를 제공하기 만하면됩니다.

Android 4.4 (API 레벨 19) 이상에서는 ACTION_OPEN_DOCUMENT 인 텐트를 사용하는 추가 옵션이 있습니다.이 옵션은 사용자가 다른 앱에서 제공 한 모든 파일을 찾아 볼 수 있도록 시스템 제어 선택기 UI 제어를 표시합니다. 이 단일 UI에서 사용자는 지원되는 모든 앱에서 파일을 선택할 수 있습니다.

Android 5.0 (API 레벨 21) 이상에서는 ACTION_OPEN_DOCUMENT_TREE 인 텐트를 사용하여 사용자가 클라이언트 앱이 액세스 할 디렉토리를 선택할 수 있습니다.

스토리지 액세스 프레임 워크를 사용하여 파일 열기-Android Docs

     val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
     intent.type = "image/*"
     startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)

0

로컬에서만 선택하려면 다음을 추가하십시오.

        i.putExtra(Intent.EXTRA_LOCAL_ONLY,true)

그리고 이것은 잘 작동합니다 :

    val i = Intent(Intent.ACTION_GET_CONTENT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
    i.type = "image/*"
    i.putExtra(Intent.EXTRA_LOCAL_ONLY,true)
    startActivityForResult(Intent.createChooser(i,"Select Photo"),pickImageRequestCode)

-7

U는이 답변보다 쉽게 ​​할 수 있습니다.

Uri Selected_Image_Uri = data.getData();
ImageView imageView = (ImageView) findViewById(R.id.loadedimg);
imageView.setImageURI(Selected_Image_Uri);

나는 그것을하고 작동했다. 예를 들어 서버로 보내기 위해 파일을 제출 해야하는 경우 다른 방법을 사용해야하지만 이미지를 이미지보기에로드하기 만하면이 쉬운 솔루션을 수행 할 수 있습니다.
Alireza Taghizadeh

5
SO에 오신 것을 환영합니다! 자신의 게시물에 댓글을 달지 않고 게시물을 편집 할 수도 있습니다. 귀하의 의견이 답변을 설명해야한다면, 답변 자체에 포함시키지 않겠습니까? 개인적으로, 나는이 오래된 질문에 대한 당신의 (늦은) 대답이 질문과 어떻게 관련되어 있는지 알지 못합니다. 아직 답을 얻지 못한 질문에 먼저 대답하는 것이 좋을까요?
cfi

1
안드로이드 질문을 찾을 수 없습니다. 어떻게 안드로이드 질문 만 볼 수 있습니까?
Alireza Taghizadeh

3
도움말 페이지를 읽으십시오. 또한 댓글은 사이트의 작동 방식에 대한 토론을위한 것이 아니며, 다른 사용자와의 실시간 토론을 위해 대화방을 사용할 수 있으며, 메타 (
도움말
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.