마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

갤러리에서 이미지 불러와 이미지 뷰에 띄우기하는데 자꾸 오류가 터지는군요

0 추천
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.FileNotFoundException;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    final int REQ_CODE_SELECT_IMAGE=100;


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

    public void getPhotoFromGallery(View v)
    {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
        intent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, REQ_CODE_SELECT_IMAGE);

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


        Toast.makeText(getBaseContext(), "resultCode : "+resultCode,Toast.LENGTH_SHORT).show();

        if(requestCode == REQ_CODE_SELECT_IMAGE)
        {
            if(resultCode== Activity.RESULT_OK)
            {
                try {
                    //Uri에서 이미지 이름을 얻어온다.
                    //String name_Str = getImageNameToUri(data.getData());

                    //이미지 데이터를 비트맵으로 받아온다.
                    Bitmap image_bitmap 	= MediaStore.Images.Media.getBitmap(getContentResolver(), data.getData());
                    ImageView image = (ImageView)findViewById(R.id.imageView);

                    //배치해놓은 ImageView에 set
                    image.setImageBitmap(image_bitmap);


                    //Toast.makeText(getBaseContext(), "name_Str : "+name_Str , Toast.LENGTH_SHORT).show();


                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
    public String getImageNameToUri(Uri data)
    {
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(data, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

        cursor.moveToFirst();

        String imgPath = cursor.getString(column_index);
        String imgName = imgPath.substring(imgPath.lastIndexOf("/")+1);

        return imgName;
    }
}

 

 

널리고 널린 상용코드인데 이게 터지네요 

디버깅 해보니 

catch (Exception e)
{
    e.printStackTrace();
}

가 터지더군요

resultcode는 -1이던데 이게 무슨 의미인가요 

 

익명사용자 님이 2016년 7월 18일 질문

1개의 답변

0 추천
resultcode가 -1이면 Activity에 정의된 RESULT_OK 입니다.

내부적으로 ACTION_PICK 호출을통해 갤러리에서 이미지 선택하면 setResult함수에 RESULT_OK로 명시적으로 onActivityResult에 알려주도록 구현되어 있는 정상적인 동작인것이죠

 

제 기억으로 onActivityResult를 통해 넘어오는 intent.getData 자체가 원본 이미지가 아니라 썸네일인것으로 알고 있는데 이미지마다의 썸네일이 무결성을 보장하지는 않습니다. 없을 수도 있다는 것이죠 그래서 Null포인터로 터지는게 아닌가 의심이 들지만 정확한 판단을 요구하신다면 stacktrace를 같이 올려주시는게 좋을거 같습니다.

 

intent를 통해 넘어오는 데이터중 선택한 이미지 파일의 URI가 같이 넘어오게 되는데 그URI를 통해 선택한 파일을 핸들링 할수 있었던 기억이 어렴풋이 나네요.

저 코드를 다 긁어 오신거라면 getImageNameToUri 함수가 그 URI를 통해 실제 파일 경로를 추출하는 역할을 하는것이겠죠?
Development Guy (70,570 포인트) 님이 2016년 7월 19일 답변
Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media/35 from pid=661, uid=10058 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()

이 스택트레이스에 뜬거인데...

여기에 나온 경로와 실제 내부의 sdcard/picture/ 하고 동일해야 실행될수 있다는 말씀인가요?
...