2015-10-19 28 views
7

W mojej aplikacji na Androida mam bitmapę (powiedzmy b) i przycisk. Teraz, gdy kliknę przycisk, chcę udostępnić mapę bitową. Ja wykorzystując poniższy kod w moim onClick() do osiągnięcia tego celu: -Udostępnianie bitmapy za pośrednictwem Android Intent

Intent intent = new Intent(Intent.ACTION_SEND); 
intent.setType("image/png"); 
intent.putExtra(Intent.EXTRA_STREAM, b); 
startActivity(Intent.createChooser(intent , "Share")); 

Spodziewałem listę wszystkich aplikacji, które są w stanie obsłużyć tę intencję, ale nic. Nie ma listy aplikacji ani nie ma żadnego błędu w studiu Android. Moja aplikacja zostaje zawieszona na jakiś czas, a następnie przestaje działać.

Sprawdziłem bitmapę i wszystko jest w porządku (nie jest puste).

Gdzie się mylę?

Odpowiedz

4

Cytowanie the documentation:

Zawartość: URI posiadający strumień danych związanych z zamiarem stosowane przy ACTION_SEND dostarczać dane wysyłane.

b, zatem nie ma być Bitmap, ale raczej Uri wskazujące na Bitmap, podawane przez ContentProvider. Na przykład możesz napisać plik Bitmap, a następnie użyć FileProvider, aby go wyświetlić.

11

Jako CommonsWare stwierdził, że musisz pobrać URI do bitmapy i przekazać to jako swoje Extra.

String bitmapPath = Images.Media.insertImage(getContentResolver(), bitmap,"title", null); 
Uri bitmapUri = Uri.parse(bitmapPath); 
... 
intent.putExtra(Intent.EXTRA_STREAM, bitmapUri); 
+0

działa idealnie –

6

** wreszcie mam rozwiązanie **

Krok 1:. Podziel Intent obsługi Block. To Pop Up okno z listy aplikacji w ciebie zadzwonić

public void share_bitMap_to_Apps() { 

    Intent i = new Intent(Intent.ACTION_SEND); 

    i.setType("image/*"); 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    /*compress(Bitmap.CompressFormat.PNG, 100, stream); 
    byte[] bytes = stream.toByteArray();*/ 


    i.putExtra(Intent.EXTRA_STREAM, getImageUri(mContext, getBitmapFromView(relative_me_other))); 
    try { 
     startActivity(Intent.createChooser(i, "My Profile ...")); 
    } catch (android.content.ActivityNotFoundException ex) { 

     ex.printStackTrace(); 
    } 


} 

Krok 2: Konwersja widok na bitmapę

public static Bitmap getBitmapFromView(View view) { 
    //Define a bitmap with the same size as the view 
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(),  view.getHeight(), Bitmap.Config.ARGB_8888); 
    //Bind a canvas to it 
    Canvas canvas = new Canvas(returnedBitmap); 
    //Get the view's background 
    Drawable bgDrawable = view.getBackground(); 
    if (bgDrawable != null) 
     //has background drawable, then draw it on the canvas 
     bgDrawable.draw(canvas); 
    else 
     //does not have background drawable, then draw white background on the canvas 
     canvas.drawColor(Color.WHITE); 
    // draw the view on the canvas 
    view.draw(canvas); 
    //return the bitmap 
    return returnedBitmap; 
} 

Krok 3:

Aby uzyskać identyfikator URI z obrazu bitmapowego

public Uri getImageUri(Context inContext, Bitmap inImage) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 

    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 
    return Uri.parse(path); 
} 
+1

Nie zapomnij wymagają android.permission.WRITE_EXTERNAL_STORAGE – appsthatmatter

2
ImageButton capture_share = (ImageButton) findViewById(R.id.share); 
capture_share.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 

    String bitmapPath = MediaStore.Images.Media.insertImage(getContentResolver(), bitmap,"title", null); 
    Uri bitmapUri = Uri.parse(bitmapPath); 

     Intent intent = new Intent(Intent.ACTION_SEND); 
     intent.setType("image/png"); 
     intent.putExtra(Intent.EXTRA_STREAM, bitmapUri); 
     startActivity(Intent.createChooser(intent, "Share")); 



    } 
}); 
+0

Dodać trochę opis, aby odpowiedzieć na jasnym zrozumieniem. @lalit Baghel –