2010-03-17 3 views

답변

253

BitmapParcelable 구현, 그래서 당신은 항상 의도를 전달할 수하십시오 Parcelable가 발생합니다 같은 비트 맵을 통과, 사실

Intent intent = getIntent(); 
Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage"); 
+68

경우, 그는'URI' 또는 비트 맵의'ResourceID' 아닌 비트 맵 자체를 전달하는 것이 좋습니다. 전체 비트 맵을 전달하려면 많은 메모리가 필요합니다. URL을 전달할 때 메모리가 거의 필요하지 않으므로 각 액티비티에서 필요에 따라 비트 맵을로드하고 크기를 조정할 수 있습니다. – slayton

+0

이 2.3에서 작동하지 않습니다. –

+3

나를 위해 작동하지 않지만이 작업은 다음과 같습니다. http://stackoverflow.com/questions/11010386/send-bitmap-using-intent-android – Houssem

16

:

Intent intent = new Intent(this, NewActivity.class); 
intent.putExtra("BitmapImage", bitmap); 

하고 다른 쪽 끝을 검색 "JAVA BINDER FAILURE"오류가 발생했습니다. 비트 맵을 바이트 배열로 전달하고 다음 활동에서 표시 할 수 있도록 빌드하십시오.
내 경우 how do you pass images (bitmaps) between android activities using bundles?

+0

방금이 어려운 교훈을 배웠습니다. 직관적이지 않습니다. – ZaBlanc

-2

, 위에서 언급 한 방법은 나를 위해 일하지 않았다 :

나는 여기에 내 솔루션을 공유했습니다. 비트 맵을 의도에 넣을 때마다 두 번째 활동이 시작되지 않았습니다. 비트 맵을 byte []로 전달할 때도 마찬가지입니다.

나는이 link을 따라 매우 빠르게 샤름과 같은 일 : 제 1 acitiviy에

package your.packagename 

import android.graphics.Bitmap; 

public class CommonResources { 
     public static Bitmap photoFinishBitmap = null; 
} 

을 :

Constants.photoFinishBitmap = photoFinishBitmap; 
Intent intent = new Intent(mContext, ImageViewerActivity.class); 
startActivity(intent); 

을 여기 내 2 차 활동의)합니다 (에서 onCreate입니다 :

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bitmap photo = Constants.photoFinishBitmap; 
    if (photo != null) { 
     mViewHolder.imageViewerImage.setImageDrawable(new BitmapDrawable(getResources(), photo)); 
    } 
} 
+0

나는 이것을 시도했지만 작동하지 않았다. 링크를 따라 가면'Constants.photoFinishBitmap' 대신'CommonResources.photoFinishBitmap'을 사용해야합니다. –

+0

나쁜 습관. 런타임시 응용 프로그램의 권한 변경과 같은 전체 프로세스를 재 작성하는 동안 Activity 클래스의 정적 필드는 어떻게됩니까? 대답은 NPE입니다. – Alexander

7

활동간에 번들로 비트 맵을 패스하는 것은 좋은 생각이 아닙니다. Parceable (1MB)의 크기 제한 때문에. 내부 저장소의 파일에 비트 맵을 저장하고 여러 가지 작업으로 저장된 비트 맵을 검색 할 수 있습니다. 다음은 몇 가지 샘플 코드입니다.

내부 저장 장치에 파일에 myimage을을 비트 맵을 저장하려면

Bitmap bitmap = BitmapFactory.decodeStream(context 
        .openFileInput("myImage"));//here context can be anything like getActivity() for fragment, this or MainActivity.this 

:

public String createImageFromBitmap(Bitmap bitmap) { String fileName = "myImage";//no .png or .jpg needed try { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes); FileOutputStream fo = openFileOutput(fileName, Context.MODE_PRIVATE); fo.write(bytes.toByteArray()); // remember close file output fo.close(); } catch (Exception e) { e.printStackTrace(); fileName = null; } return fileName; } 

그런 다음 다음 활동에서 당신은 다음과 같은 코드를 사용하여 비트 맵으로이 파일 myimage을 디코딩 할 수 있습니다 노트
null 및 비트 맵 스케일링에 대한 많은 검사가 필요 없습니다.

4

이미지가 너무 커서 저장소에로드 할 수 없으면 (수신 작업 내에서) 비트 맵에 대한 전역 정적 참조 만 사용하는 것이 좋습니다 (onDestory에서 null로 재설정 됨). isChangingConfigurations가 true를 돌려 줄 때만

3

인 텐트에는 크기 제한이 있기 때문에. 공용 정적 객체를 사용하여 서비스에서 브로드 캐스트로 비트 맵을 전달합니다.내 서비스에서

public class ImageBox { 
    public static Queue<Bitmap> mQ = new LinkedBlockingQueue<Bitmap>(); 
} 

패스

private void downloadFile(final String url){ 
     mExecutorService.submit(new Runnable() { 
      @Override 
      public void run() { 
       Bitmap b = BitmapFromURL.getBitmapFromURL(url); 
       synchronized (this){ 
        TaskCount--; 
       } 
       Intent i = new Intent(ACTION_ON_GET_IMAGE); 
       ImageBox.mQ.offer(b); 
       sendBroadcast(i); 
       if(TaskCount<=0)stopSelf(); 
      } 
     }); 
    } 

내 브로드 캐스트 리시버

private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      LOG.d(TAG, "BroadcastReceiver get broadcast"); 

      String action = intent.getAction(); 
      if (DownLoadImageService.ACTION_ON_GET_IMAGE.equals(action)) { 
       Bitmap b = ImageBox.mQ.poll(); 
       if(b==null)return; 
       if(mListener!=null)mListener.OnGetImage(b); 
      } 
     } 
    }; 
0

그것은 늦을 수도 있지만 도움이 될 수 있습니다. 이렇게 제 단편 또는 활동 은 .. 제 클래스/단편에이어서

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     description des = new description(); 

     if (requestCode == PICK_IMAGE_REQUEST && data != null && data.getData() != null) { 
      filePath = data.getData(); 
      try { 
       bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), filePath); 
       imageView.setImageBitmap(bitmap); 
       ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
       bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
       constan.photoMap = bitmap; 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

public static class constan { 
    public static Bitmap photoMap = null; 
    public static String namePass = null; 
} 

... 대한 클래스를 선언 할
Bitmap bm = postFragment.constan.photoMap; 
final String itemName = postFragment.constan.namePass; 

는 호프가.

0

비트 맵 전송을 만들 수 있습니다. 첫 번째 클래스에서 ....

을이 시도 :

1) 작성 :

private static Bitmap bitmap_transfer; 

2)) getter 및 setter

public static Bitmap getBitmap_transfer() { 
    return bitmap_transfer; 
} 

public static void setBitmap_transfer(Bitmap bitmap_transfer_param) { 
    bitmap_transfer = bitmap_transfer_param; 
} 

3 만들기 이미지를 설정합니다

ImageView image = (ImageView) view.findViewById(R.id.image); 
image.buildDrawingCache(); 
setBitmap_transfer(image.getDrawingCache()); 

그런 다음, 두 번째 cla SS는 : 비트 맵 파일 또는 자원으로 존재

ImageView image2 = (ImageView) view.findViewById(R.id.img2); 
imagem2.setImageDrawable(new BitmapDrawable(getResources(), classe1.getBitmap_transfer())); 
관련 문제