메인에서 디바이스 내부 이미지 긁어오고 긁어온 이미지 클릭하면 편집부로 넘어가는거 짤려고 하는데 캔버스에서 이미지를 출력이 안되네요  ㅠㅠ







로그입니다 ㅠ

10-21 16:19:39.316 13580-13580/com.example.user.viewediter E/BitmapFactory+ Unable to decode stream: java.io.FileNotFoundException: _id: open failed: ENOENT (No such file or directory)

10-21 16:19:39.316 13580-13580/com.example.user.viewediter D/AndroidRuntime+ Shutting down VM

10-21 16:19:39.321 13580-13580/com.example.user.viewediter E/AndroidRuntime+ FATAL EXCEPTION: main

Process: com.example.user.viewediter, PID: 13580

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference

at com.example.user.viewediter.editPage$MyGraphicView.onDraw(editPage.java:78)

at android.view.View.draw(View.java:16203)

at android.view.View.updateDisplayListIfDirty(View.java:15126)

at android.view.View.getDisplayList(View.java:15149)

at android.view.View.draw(View.java:15924)

at android.view.ViewGroup.drawChild(ViewGroup.java:3703)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3497)

at android.view.View.updateDisplayListIfDirty(View.java:15121)

at android.view.View.getDisplayList(View.java:15149)

at android.view.View.draw(View.java:15924)

at android.view.ViewGroup.drawChild(ViewGroup.java:3703)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3497)

at android.view.View.updateDisplayListIfDirty(View.java:15121)

at android.view.View.getDisplayList(View.java:15149)

at android.view.View.draw(View.java:15924)

at android.view.ViewGroup.drawChild(ViewGroup.java:3703)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3497)

at android.view.View.updateDisplayListIfDirty(View.java:15121)

at android.view.View.getDisplayList(View.java:15149)

at android.view.View.draw(View.java:15924)

at android.view.ViewGroup.drawChild(ViewGroup.java:3703)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3497)

at android.view.View.updateDisplayListIfDirty(View.java:15121)

at android.view.View.getDisplayList(View.java:15149)

at android.view.View.draw(View.java:15924)

at android.view.ViewGroup.drawChild(ViewGroup.java:3703)

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3497)

at android.view.View.draw(View.java:16206)

at android.widget.FrameLayout.draw(FrameLayout.java:592)

at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2932)

at android.view.View.updateDisplayListIfDirty(View.java:15126)

at android.view.View.getDisplayList(View.java:15149)

at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:275)

at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:281)

at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:320)

at android.view.ViewRootImpl.draw(ViewRootImpl.java:2751)

at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2584)

at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2176)

at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1191)

at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6642)

at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)

at android.view.Choreographer.doCallbacks(Choreographer.java:590)

at android.view.Choreographer.doFrame(Choreographer.java:560)

at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)

at android.os.Handler.handleCallback(Handler.java:739)

at android.os.Handler.dispatchMessage(Handler.java:95)

at android.os.Looper.loop(Looper.java:145)

at android.app.ActivityThread.main(ActivityThread.java:5951)

at java.lang.reflect.Method.invoke(Native Method)

at java.lang.reflect.Method.invoke(Method.java:372)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

<!--[if !supportEmptyParas]--> <!--[endif]-->


메인

package com.example.user.viewediter;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

import java.util.ArrayList;

public class MainActivity extends Activity {
    //cursor and columnIndex defined Globally so we can use it in below class.
    static Cursor cursor;
    static int columnIndex;
    static int imageID;
    static Uri uri;
    static String[] list1;
    static String[] list2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("이미지 리스트 표시");

        //Searching Images ID's from Gallery. _ID is the Default id code for all. You can retrive image,contacts,music id in the same way.
        // 갤러리에서 이미지 ID를 검색. _ID는 모든 기본 ID 코드입니다. 동일한 방식으로 화상, 연락처, 곡 ID를 검색 할 수있다.
        list1 = new String[]{MediaStore.Images.Media._ID};
        list2 = new String[]{MediaStore.Images.Media.DATA};

        //Retriving Images from Database(SD CARD) by Cursor.
        cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, list1, null, null, MediaStore.Images.Media._ID);
        columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);


        GridView sdcardimage = (GridView) findViewById(R.id.gridview);
        ImageAdapter adapter=new ImageAdapter(this);
        sdcardimage.setAdapter(adapter);
    }

    // Adapter for Grid View
    private class ImageAdapter extends BaseAdapter {
        private Context context;

        public ImageAdapter(Context localContext) {
            context = localContext;
        }
        public int getCount() {
            return cursor.getCount();
        }
        public Object getItem(int position) {
            return position;
        }
        public long getItemId(int position) {
            return position;
        }
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = new ViewHolder();
            // 캐시된 뷰가 없을 경우 새로 생성하고 뷰홀더를 생성한다
            if (convertView == null) {
                holder.picturesView = new ImageView(context);
                //Converting the Row Layout to be used in Grid View
                convertView = getLayoutInflater().inflate(R.layout.row, parent, false);

                //You can convert Layout in this Way with the Help of View Stub. View Stub is newer. Read about ViewStub.Inflate and its parameter.
                //convertView= ViewStub.inflate(context,R.layout.row,null);
                convertView.setTag(holder);
                // 캐시된 뷰가 있을 경우 저장된 뷰홀더를 사용한다
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            cursor.moveToPosition(position);
            imageID = cursor.getInt(columnIndex);

            //In Uri "" + imageID is to convert int into String as it only take String Parameter and imageID is in Integer format.
            //You can use String.valueOf(imageID) instead.
            //추가된 ID를 보유한 Uri 객체를 리턴하는 static 메소드
            uri = Uri.withAppendedPath(
                    MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID);

            //Setting Image to View Holder Image View.
            holder.picturesView = (ImageView) convertView.findViewById(R.id.imageview);
            //holder.picturesView.setLayoutParams(new GridView.LayoutParams(100,150));
            holder.picturesView.setImageURI(uri);
            holder.picturesView.setScaleType(ImageView.ScaleType.CENTER_CROP);

            holder.picturesView.setOnClickListener(new View.OnClickListener(){
                public void onClick(View v) {
                    Intent intent = new Intent(getApplicationContext(), editPage.class);
                    intent.putExtra("List", list1);
                    intent.putExtra("ColumIndex", columnIndex);
                    startActivity(intent);
                }
            });
            return convertView;
        }

        // View Holder pattern used for Smooth Scrolling. As View Holder pattern recycle the findViewById() object.
        class ViewHolder {
            private ImageView picturesView;
        }
    }
}


그리고 편집부분입니다.

public class editPage extends Activity {
    MyGraphicView graphicView; // 선택된 이미지 출력
    int curNum; // 현재 파일에 순서상 지정된 번호
    String[] imageFiles; // 파일들의 위치
    ImageButton ibZoomin, ibZoomout, ibRotate, ibBright, ibDark, ibGray;

    static float scaleX = 1, scaleY = 1;
    static float angle = 0;
    static float color = 1;
    static float satur = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.edit_field);
        setTitle("이미지 편집");

        LinearLayout pictureLayout = (LinearLayout) findViewById(R.id.pictureLayout);
        graphicView = (MyGraphicView) new MyGraphicView(this);
        pictureLayout.addView(graphicView);

        Intent intent = getIntent();
        imageFiles = intent.getStringArrayExtra("List"); //인텐트에서 조금 전 이미지 파일 리스트를 전부 받아온다.
        curNum = intent.getIntExtra("ColumIndex", 0); //현재 이미지 번호를 가져온다.
        //imageFiles = new File("/sdcard/pictures").listFiles();//sd카드 안의 파일들의 배열을 생성
        //imageFname = imageFiles[curNum].toString(); // 배열의 1칸에 입력된 이미지의 이름으로 초기화한다.
        graphicView.imagePath = imageFiles[curNum]; //이미지 표시
        //ImFName.setText(imageFname); // 파일의 이름을 텍스트뷰에 표시한다.

        clickIcons();
    }
    private static class MyGraphicView extends View {
        String imagePath = null;
        public MyGraphicView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }
        @Override
        protected void onDraw(Canvas canvas) { //캔버스에 이미지를 표시하기 위한 메서드를 작성
            super.onDraw(canvas);
            if (imagePath != null) {
                int cenX = this.getWidth() / 2;
                int cenY = this.getHeight() / 2;
                canvas.scale(scaleX, scaleY, cenX, cenY);
                canvas.rotate(angle, cenX, cenY);

                Paint paint = new Paint();
                float[] array = { color, 0, 0, 0, 0, 0, color, 0, 0, 0, 0, 0,
                        color, 0, 0, 0, 0, 0, 1, 0 };
                ColorMatrix cm = new ColorMatrix(array);

                if (satur == 0)
                    cm.setSaturation(satur);

                paint.setColorFilter(new ColorMatrixColorFilter(cm));

                Bitmap picture = decodeFile(imagePath);//imagePath의 값으로 picture의 값을 초기화
                int picX = (this.getWidth() - picture.getWidth()) / 2;
                int picY = (this.getHeight() - picture.getHeight()) / 2;
                canvas.drawBitmap(picture, picX, picY, paint); // picture의 이미지를 화면상에 표시한다.
                picture.recycle();
            }
        }
    }