¿Cómo adjuntar una imagen de drawable a gmail?

Estoy intentando adjuntar una imagen de mi gridview a Gmail o Facebook, pero cada vez que bash adjuntar mi aplicación se cuelga, y obtengo un error de seguimiento con la excepción nullpointer, a continuación sigue mi código con la selección de imágenes gridview, ¿alguien puede ayudarme?

public class Free_Cover_Activity extends AppCompatActivity { GridView grid; int[] imageId = { R.drawable.discovercover, R.drawable.burpresswordfree, R.drawable.flyfree, R.drawable.cantmovefree, R.drawable.cantmovewordfree, R.drawable.chalkthisfree, R.drawable.fivehundredmetersfree, R.drawable.freeexercise, R.drawable.gym_smilie, R.drawable.hundredcalrairsfree, R.drawable.injuryfree, R.drawable.jumpropefree, R.drawable.nicesnathcfree, R.drawable.personglrecordfree, R.drawable.posefree, R.drawable.pushupfree, R.drawable.shoulder, R.drawable.timewordfree, R.drawable.unbrokernfree, R.drawable.weightbeltfree }; private Bitmap mBitmap; private Intent email; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.free_cover_gridview); android.support.v7.app.ActionBar abar = getSupportActionBar(); ColorDrawable colorDrawable = new ColorDrawable(Color.parseColor("#D64365")); abar.setBackgroundDrawable(colorDrawable); abar.hide(); CustomGridFreeCover adapter = new CustomGridFreeCover(Free_Cover_Activity.this, imageId); grid=(GridView)findViewById(R.id.freecover_grid); grid.setAdapter(adapter); grid.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { try { Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.drawable.discovercover); /* replace "R.drawable.bubble_green" with the image resource you want to share from drawable */ ByteArrayOutputStream bytes = new ByteArrayOutputStream(); largeIcon.compress(Bitmap.CompressFormat.JPEG, 40, bytes); //you can create a new file name "test.jpg" in sdcard folder. File f = new File(Environment.getExternalStorageDirectory() + File.separator + "test.jpg"); f.createNewFile(); //write the bytes in file FileOutputStream fo = new FileOutputStream(f); fo.write(bytes.toByteArray()); //remember close de FileOutput fo.close(); } catch (IOException e) { //TODO Auto-generated catch block e.printStackTrace(); } Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND); shareIntent.setType("image/jpeg"); //set your subject shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Hi"); //set your message shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "How are you"); String imagePath = Environment.getExternalStorageDirectory() + File.separator + "test.jpg"; File imageFileToShare = new File(imagePath); Uri uri = Uri.fromFile(imageFileToShare); shareIntent.putExtra(Intent.EXTRA_STREAM, uri); startActivity(Intent.createChooser(shareIntent, "Share Image")); } }); } public class CustomGridFreeCover extends BaseAdapter { private Context mContext; //private final String[] web; private final int[] Imageid; public CustomGridFreeCover(Context c,int[] Imageid ) { mContext = c; this.Imageid = Imageid; //this.web = web; } @Override public int getCount() { //TODO Auto-generated method stub return Imageid.length; } @Override public Object getItem(int position) { //TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { //TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { //TODO Auto-generated method stub View grid; LayoutInflater inflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (convertView == null) { grid = new View(mContext); grid = inflater.inflate(R.layout.free_cover_griditem, null); //TextView textView = (TextView) grid.findViewById(R.id.grid_text); ImageView imageView = (ImageView)grid.findViewById(R.id.grid_image_freecover); //textView.setText(web[position]); imageView.setImageResource(Imageid[position]); } else { grid = (View) convertView; } return grid; } } } 

Aquí está el código de trabajo que necesita:

Primero guarde la imagen de Drawable a SD Card aquí está el código:

 try{ Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.drawable.bubble_green); //replace "R.drawable.bubble_green" with the image resource you want to share from drawable ByteArrayOutputStream bytes = new ByteArrayOutputStream(); largeIcon.compress(Bitmap.CompressFormat.JPEG, 40, bytes); // you can create a new file name "test.jpg" in sdcard folder. File f = new File(Environment.getExternalStorageDirectory() + File.separator + "test.jpg"); f.createNewFile(); // write the bytes in file FileOutputStream fo = new FileOutputStream(f); fo.write(bytes.toByteArray()); // remember close de FileOutput fo.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

A continuación, obtenga la imagen guardada de la SD card y adjúntela en la intención del correo electrónico de esta manera:

  Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND); shareIntent.setType("image/jpeg"); shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Hi"); //set your subject shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "How are you"); //set your message String imagePath = Environment.getExternalStorageDirectory() + File.separator + "test.jpg"; File imageFileToShare = new File(imagePath); Uri uri = Uri.fromFile(imageFileToShare); shareIntent.putExtra(Intent.EXTRA_STREAM, uri); startActivity(Intent.createChooser(shareIntent, "Share Image")); 

Esto es lo que funcionó para mí perfectamente.

  Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND); shareIntent.setType("image/jpeg"); shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, getResources().getString(R.string.share_subject)); shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, getResources().getString(R.string.share_message)); shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("android.resource://" + C.PROJECT_PATH + "/drawable/" + R.drawable.image_to_share); startActivity(Intent.createChooser(shareIntent, "Share Image")); 

Pero siempre recomendaré decodificar un Bitmap de Bitmap desde este recurso, guardarlo como un File en el almacenamiento y luego usar ese archivo. Una manera más confiable de usar directamente de los recursos.

cosa romana es que está pasando un objeto de bitmap nulo

  Bitmap icon = mBitmap; 

necesita asignar bitmap primero, entonces el código comenzará a funcionar

para obtener más información, puede echar un vistazo a los siguientes enlaces:

https://github.com/codepath/android_guides/wiki/Sharing-Content-with-Intents

http://developer.android.com/training/sharing/send.html

Primero, convierta su drwable a imagen y guárdela en SDCard

Tienda extraíble a la tarjeta SD


Entonces

 private void shareImage() { Intent share = new Intent(Intent.ACTION_SEND); // setType("image/png"); OR for jpeg: setType("image/jpeg"); share.setType("image/*"); // Make sure you put example png image named yourImg.png in your // directory String imagePath = Environment.getExternalStorageDirectory() + "/yourImg.png"; File imageFileToShare = new File(imagePath); Uri uri = Uri.fromFile(imageFileToShare); share.putExtra(Intent.EXTRA_STREAM, uri); startActivity(Intent.createChooser(share, "Share Image!")); }