Button클릭 시 image/* 파일들 선택할 수 있는 창 열기

<요약>

OnCreate 부문에 Button onClickListener을 추가 하고, Intent를 활용하여 

전체적인 파일을 가져올 수 있게 합니다.

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button openimg = (Button)findViewById(R.id.openimg);
openimg.setOnClickListener(new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivity(intent);
}
});

}


때때로 Android애플리케이션에서 사용자가 선택한 후에 응용 프로그램에 의해 표시되는 갤러리에서 이미지를 선택할 수 있는 갤러리에서 이미지를 선택할 수 있습니다.

이 글에서는 사용자가 모든 앱에서 이미지를 선택할 수 있는 단일 인터페이스를 호출하는 방법을 살펴보겠습니다.(예:갤러리, 사진, ESFileExplorer등)및 폴더(GoogleDrive, 최근, 다운로드 등)를 인첸트를 사용합니다.



갤러리 이미지 갤러리 시작


사용자가 다음과 같은 의도로 다음과 같은 의도를 사용할 수 있도록 하려면 사용자가 이미지를 선택할 수 있습니다.

Intent intent = new Intent();
// Show only images, no videos or anything else
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
// Always show the chooser (if there are multiple options available)
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);


PICK_IMAGE_REQUEST는 인스턴스 변수로 정의된 요청 코드입니다.

private int PICK_IMAGE_REQUEST = 1;


Activity/Fragment에서 선택한 영상 표시

일단 선택이 이루어지면 ImageView 사용자 인터페이스에서 이미지를 플립 차트에 표시합니다.

이를 위해서는 onActivityResult()를 오버 라이드 해야 합니다.


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
 
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
 
        Uri uri = data.getData();
 
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
            // Log.d(TAG, String.valueOf(bitmap));
 
            ImageView imageView = (ImageView) findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이렇게 배치하려면 다음과 같은 작업을 수행해야 합니다.

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView" />


갤러리에서 선택할 때 선택한 사진이 UI에 표시되고 선택한 사진이 어떻게 표시되는지 확인할 수 있습니다.


컨텐츠 URI에서 절대 파일 경로 가져오기


Uri uri = data.getData();
String[] projection = { MediaStore.Images.Media.DATA };
 
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
cursor.moveToFirst();
 
Log.d(TAG, DatabaseUtils.dumpCursorToString(cursor));
 
int columnIndex = cursor.getColumnIndex(projection[0]);
String picturePath = cursor.getString(columnIndex); // returns null
cursor.close();


그러면 커서에서 반환된 MediaStore.Images.Media.DATA 값이 null이라는 것을 알 수 있습니다.

이 문제(및 수정 사항)는 다음과 같은 스레드 스레드에서 해결되었습니다.


Button클릭 시 image/* 파일들 선택할 수 있는 창 열기

<요약>

OnCreate 부문에 Button onClickListener을 추가 하고, Intent를 활용하여 

전체적인 파일을 가져올 수 있게 합니다.

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button openimg = (Button)findViewById(R.id.openimg);
openimg.setOnClickListener(new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivity(intent);
}
});

}


때때로 Android애플리케이션에서 사용자가 선택한 후에 응용 프로그램에 의해 표시되는 갤러리에서 이미지를 선택할 수 있는 갤러리에서 이미지를 선택할 수 있습니다.

이 글에서는 사용자가 모든 앱에서 이미지를 선택할 수 있는 단일 인터페이스를 호출하는 방법을 살펴보겠습니다.(예:갤러리, 사진, ESFileExplorer등)및 폴더(GoogleDrive, 최근, 다운로드 등)를 인첸트를 사용합니다.



갤러리 이미지 갤러리 시작


사용자가 다음과 같은 의도로 다음과 같은 의도를 사용할 수 있도록 하려면 사용자가 이미지를 선택할 수 있습니다.

Intent intent = new Intent();
// Show only images, no videos or anything else
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
// Always show the chooser (if there are multiple options available)
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);


PICK_IMAGE_REQUEST는 인스턴스 변수로 정의된 요청 코드입니다.

private int PICK_IMAGE_REQUEST = 1;


Activity/Fragment에서 선택한 영상 표시

일단 선택이 이루어지면 ImageView 사용자 인터페이스에서 이미지를 플립 차트에 표시합니다.

이를 위해서는 onActivityResult()를 오버 라이드 해야 합니다.


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
 
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
 
        Uri uri = data.getData();
 
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
            // Log.d(TAG, String.valueOf(bitmap));
 
            ImageView imageView = (ImageView) findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이렇게 배치하려면 다음과 같은 작업을 수행해야 합니다.

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView" />


갤러리에서 선택할 때 선택한 사진이 UI에 표시되고 선택한 사진이 어떻게 표시되는지 확인할 수 있습니다.


컨텐츠 URI에서 절대 파일 경로 가져오기


Uri uri = data.getData();
String[] projection = { MediaStore.Images.Media.DATA };
 
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
cursor.moveToFirst();
 
Log.d(TAG, DatabaseUtils.dumpCursorToString(cursor));
 
int columnIndex = cursor.getColumnIndex(projection[0]);
String picturePath = cursor.getString(columnIndex); // returns null
cursor.close();


그러면 커서에서 반환된 MediaStore.Images.Media.DATA 값이 null이라는 것을 알 수 있습니다.

이 문제(및 수정 사항)는 다음과 같은 스레드 스레드에서 해결되었습니다.

요청에 의해 호출된 앱에서 다양한 섹션(탐색 드로어에 있는)을 선택할 때마다 다양한 종류의 Content URIs가 반환됩니다.

갤러리(앱)섹션의 선택 항목에서 얻을 수 있는 것은 다음과 같습니다.

Recents(또는 일반적으로 내 생각)에서는 다음과 같은 이점을 얻을 수 있습니다.

GoogleDrive에서 선택할 때는 다음과 같은 URI를 사용합니다.

또한 사진(앱)섹션에서 다음을 수행합니다(URL인코딩됨).





버튼 위치 내가 원하는 곳에 설정하기

처음 만들면 스튜디오 안에서는 정상작동하나, 핸드폰을 활용할 시 error문구와 함꼐 0,0으로 이동이 됩니다.

<Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        tools:layout_editor_absoluteX="62dp"
        tools:layout_editor_absoluteY="310dp" />


이 구문을 

<Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.291" />

와 같이 설정하고, 디자인 부분에서 위치를 조절해준다면 원하는 위치에 배열할 수 있습니다.





+ Recent posts