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

activity에서 뷰위에 그려진 것을 비트맵으로 저장

0 추천

안녕하세요. CaptureActivity에서 그려진 customview인 dView를 다른 액티비티에게 화면을 넘길때 dView에 그려진 것을 비트맵에 저장하고 넘기고 싶습니다. 하지만 뻘짓을 다했지만 비트맵의 객체는 계속 null입니다.

어떤것이 문제인지 모르겠습니다. 고수님들의 조언을 듣고싶습니다.

public class CaptureActivity extends Activity {
 
private static final String TAG = null;
//이미지뷰에 꼭지점에 좌표를 넣기 위해
int imageLeft;
int imageRight;
int imageBottom;
int imageTop;
 
LayoutInflater controlInflater = null;
DrawView mDraw;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_capture);
 
image1 = (ImageView) findViewById(R.id.backimage);
//image2 = (ImageView) findViewById(R.id.dView);
Bundle b = getIntent().getExtras();
 
photo = BitmapFactory.decodeFile(b.getString("path"));
image1.setImageBitmap(photo);
 
mFrameLayout = (RelativeLayout) findViewById(R.id.frame);
        
        Button crop = (Button) findViewById(R.id.crop);
       
        crop.setOnClickListener(new View.OnClickListener() {
            @Override
public void onClick(View v) {
           
             Log.d("리소스값", ""+bit);
                  Log.d("리소스값", ""+mDraw.getResources());
                  Log.d("id 값", ""+R.id.cropImage);
                  
                  if(bit !=null) {
               Intent intent = new Intent(getBaseContext(), ClipActivity.class);                
               intent.putExtra("Bitmap", bit);
               startActivity(intent);
                  }
            }
        });
        
        
}
 
public void onWindowFocusChanged(boolean hasFocus) {              
  
   
    if(mDraw == null) {
    mDraw = new DrawView(this);    
    mFrameLayout.addView(mDraw);
    }
    else{
    mFrameLayout.setDrawingCacheEnabled(true);
    mFrameLayout.buildDrawingCache();
    bit =BitmapFactory.decodeResource(mFrameLayout.getResources(), R.id.backimage) ;
    }    
        
    }
}
 
----------------------------------------------------------
 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
 
    <RelativeLayout
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="80dp" >
 
        <ImageView
            android:id="@+id/backimage"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY" />
        
        <com.slee.customview.DrawView
            android:id="@+id/dView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY" />
 
    </RelativeLayout>
 
</RelativeLayout>
----------------------------------------------------------------------------
 
고수님의 조언을 듣고싶습니다. 
 
if(mDraw == null) {
    mDraw = new DrawView(this);    
    mFrameLayout.addView(mDraw);
    }
    else{
    mFrameLayout.setDrawingCacheEnabled(true);
    mFrameLayout.buildDrawingCache();
----->     bit =BitmapFactory.decodeResource(mFrameLayout.getResources(), R.id.backimage) ;
    }  

로그를 다찍어 보았지만 여기서 값이 들어가지 않는걸 알았습니다. 

혹시 제가 멀 빠뜨리고 있는건가여? 다음액티비티에서 넘어온 비트맵을 가지고 작업을 하고 싶은데 지금 이것으로 3일을 허비하게 되었네요.

고수님의 조언을 진심으로 부탁드립니다.

slee2540 (470 포인트) 님이 2014년 5월 23일 질문

1개의 답변

0 추천
 
채택된 답변
  1. activity state 는 고려하면서 코딩 하시는건가요?
  2. onWindowFocusChanged 에서 어느 시점에서 capture 가 될거라고 생각하시는건가요?

 

저 두 물음을 곰곰히 생각해보세요 onClick 일 경우 어떤 시점인지  생각해보시구요

aucd29 (218,390 포인트) 님이 2014년 5월 23일 답변
slee2540님이 2014년 5월 29일 채택됨
onPause() 또는 onStart()이부분에서 저장을 해야하는건가여? 제가 안드로이드 초보라 잘 이해가 안되는데 좀더 자세히 알수는 없을까여?
public void onClick(View v) {
             bit =BitmapFactory.decodeResource(mFrameLayout.getResources(), R.id.backimage) ;
               Log.d("리소스값", ""+bit);
                  Log.d("리소스값", ""+mDraw.getResources());
                  Log.d("id 값", ""+R.id.cropImage);
                  
                  if(bit !=null) {
               Intent intent = new Intent(getBaseContext(), ClipActivity.class);                 
               intent.putExtra("Bitmap", bit);
               startActivity(intent);
                  }
            }
        });

여기서 값을 넣으니깐  FAILED BINDER TRANSACTION 이 오류가 뜨네요. 찾아보니깐 Activity 호출시 Intent를 통해 전달하려는 데이터량이 100k를 초과할때 발생한다고 하는데.. 비트맵을 파일로 저장해서 넘기는 거 밖에 안돼는지 궁금합니다. 답변 부탁드립니다.
activity간 전달시 bundle에 집어 넣을 수 있는 최대한도가 정해져있습니다.
큰 bitmap 파일은 전달 할수 없습니다.
그럼 큰 bitmap은 파일로 저장하여 다른 액티비티에서 불러오는 방법말고는 없는건가여? 저는 바로 저장하지 않고 다른액티비티에게 넘겨주려고 했습니다.
용량의 한계가 있으니 없다고 봐도 무방합니다.
감사합니다. 몰랐던 부분을 알게 되었네요. 디비또는 파일로 저장해야 할 것 같네요.
...