마스터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이던데 이게 무슨 의미인가요 

-----------------------------------------------------------

추가)스택트레이스 오류문입니다 

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()
 

 

read_external 저거 문제를 물어보니 매니패스트 추가 관련 문제라고했는데 

넣긴 넣었어요 근데 안되더라구요 

 

 

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

1개의 답변

0 추천
혹시 테스트하시는 디바이스가 마쉬멜로우 버전이신가요?

만약 디바이스가 마쉬멜로우 버전이고 build.gradle 파일에서 targetSdkVersion 속성이 23이면

매니페스트에서 권한을 적어도

사용자가 직접 enable 시켜야 합니다. 아래처럼요

설정->어플리케이션 관리자->지금 개발중이신 앱 이름->권한->저장공간을 힘차게 enable

하신 다음에 다시 해보세요.
Development Guy (70,570 포인트) 님이 2016년 7월 20일 답변
...