为了发送数据到另外一个activity,我们只需要指定数据与数据的类型,系统会自动识别出能够兼容接受的这些数据的activity。如果这些选择有多个,则把这些activity显示给用户进行选择;如果只有一个,则立即启动该Activity。同样的,我们可以在manifest文件的Activity描述中添加接受的数据类型。
在不同的程序之间使用intent收发数据是在社交分享内容时最常用的方法。Intent使用户能够通过最常用的程序进行快速简单的分享信息。
分享文本内容(Send Text Content)
ACTION_SEND最直接常用的地方是从一个Activity发送文本内容到另外一个Activity。例如,Android内置的浏览器可以将当前显示页面的URL作为文本内容分享到其他程序。这一功能对于通过邮件或者社交网络来分享文章或者网址给好友而言是非常有用的
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent sendIntent=new Intent(); sendIntent.setAction(Intent.ACTION_SEND);//action为执行的动作,Action_Send包含的动作为分享图片或文本 sendIntent.putExtra(Intent.EXTRA_TEXT, "this is my");//要分享的信息 sendIntent.setType("text/plain");//手机中其他app 在IntentFilter中匹配的信息 startActivity(Intent.createChooser(sendIntent,"aa"));//aa为弹出的对话框的名字 } });
为intent调用了Intent.createChooser(),那么Android总是会显示可供选择。这样有一些好处:
- 即使用户之前为这个intent设置了默认的action,选择界面还是会被显示。
- 如果没有匹配的程序,Android会显示系统信息。
- 我们可以指定选择界面的标题
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a);
1、 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.xxx);
2、Resources r = this.getContext().getResources();
Inputstream is = r.openRawResource(R.drawable.xxx);
BitmapDrawable bmpDraw = new BitmapDrawable(is);
Bitmap bmp = bmpDraw.getBitmap();
3、Resources r = this.getContext().getResources();
Bitmap bmp=BitmapFactory.decodeResource(r, R.drawable.icon);
Bitmap bmp = Bitmap.createBitmap( 300, 300, Config.ARGB_8888 );
然后将bitmap对象转为uri
Uri uri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, null, null));
下面是全部代码
Intent sendIntent = new Intent();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a);
Uri uri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, null, null));
sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_STREAM, uri); sendIntent.setType("image/*"); startActivity(Intent.createChooser(sendIntent, "分享图片"));
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
请注意以下内容:
- 我们可以使用
*/*
这样的方式来指定MIME类型,但是这仅仅会match到那些能够处理一般数据类型的Activity(即一般的Activity无法详尽所有的MIME类型) - 接收的程序需要有访问URI资源的权限。下面有一些方法来处理这个问题:
- 将数据存储在ContentProvider中,确保其他程序有访问provider的权限。较好的提供访问权限的方法是使用 per-URI permissions,其对接收程序而言是只是暂时拥有该许可权限。类似于这样创建ContentProvider的一种简单的方法是使用FileProvider helper类。
- 使用MediaStore系统。MediaStore系统主要用于音视频及图片的MIME类型。但在Android3.0之后,其也可以用于存储非多媒体类型
分享多种内容
为了同时分享多种不同类型的内容,需要使用ACTION_SEND_MULTIPLE
与指定到那些数据的URIs列表。MIME类型会根据分享的混合内容而不同。例如,如果分享3张JPEG的图片,那么MIME类型仍然是image/jpeg
。如果是不同图片格式的话,应该是用image/*
来匹配那些可以接收任何图片类型的activity。如果需要分享多种不同类型的数据,可以使用*/*
来表示MIME。像前面描述的那样,这取决于那些接收的程序解析并处理我们的数据。下面是一个例子:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a); Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); imageView.setImageBitmap(bitmap); Uri uri1 = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), bitmap1, null, null)); Uri uri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, null, null)); ArrayList images = new ArrayList<>(); images.add(uri); images.add(uri1);
sendIntent.setAction(Intent.ACTION_SEND_MULTIPLE); sendIntent.putExtra(Intent.EXTRA_STREAM, images);startActivity(Intent.createChooser(sendIntent, "分享图片"));