Intent(意图)主要是解决Android应用的各项组件之间的通讯。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。(此处省略N个字。。。。。。)。
没事找百度
就是说,Intent不光能开启本应用的其他界面,同样能打开手机上其他应用的界面,只要方法正确,everything will be true。
实践出真知,接下来就是见证奇迹的时刻。
首先确定一点,如何通过Intent,从一个应用打开另一个应用。就如我们经常看到的应用图标,手机桌面也是一个应用。所有安装的应用图标,都再桌面应用程序内。所以,从一个应用跳转到另一个应用的事情,我们每天都在做,比如打电话,比如发短信,QQ,微信,陌陌,豆瓣。。(此处继续省略N个字,博主经验有限,还需要跟大家多多探讨。学海无涯,回头是岸。)
PS:有更好的东东私聊给我!!
首先看Intent是如何做到这一点的,intent.setClassName("com.view","com.view.B");前者参数是包名,后者参数是该包种要打开的activity类界面的全名。找到微信的朋友分享界面为
com.tencent.mm.ui.tools.ShareImgUI
所以,简单包装一下,跳转到微信朋友分享的界面的代码就是- Intent intent = new Intent();
- ComponentName componentName = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");
- intent.setComponent(componentName);
- intent.setAction(Intent.ACTION_SEND);
- startActivity(intent);
我跳,我跳,我跳跳跳。。才发现界面下面有Toast提示。
好吧,分享嘛,就要有分享数据,不然分享啥呢。哈哈。微信真是太聪明了。还是老老实实的加上数据吧。于是乎一番折腾。有了下面的方法。
- private void toFriend(String text,File file) {
- Intent intent = new Intent();
- ComponentName componentName = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");
- intent.setComponent(componentName);
- intent.setAction(Intent.ACTION_SEND);
- intent.setType("image/*");
- intent.putExtra(Intent.EXTRA_TEXT, text);
- intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
- startActivity(intent);
- }
那么分享朋友圈也是差不多了。继续贴代码。
- private void toTimeLine(File file) {
- Intent intent = new Intent();
- ComponentName componentName = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI");
- intent.setComponent(componentName);
- intent.setAction(Intent.ACTION_SEND);
- intent.setType("image/*");
- intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
- startActivity(intent);
- }
OK,大功告成了。可是,这里又遇到了一个问题。就是在选择图片时,获取到得uri问题。Android在 4.3返回的是带文件路径的,而4.4返回的却是content://com.android.providers.media.documents/document/image:3951这样的。就是说,4.4以上获取到得uri不能用来剪裁,上传,分享等操作。又是一顿百度,找到了这篇文章。Android 4.4从图库选择图片,获取图片路径并裁剪。千古文章一大抄,抄来抄去有提高。
解决了我纠结一下午的难题。上代码
- package com.example.sharedemo;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.sql.Date;
- import android.R.integer;
- import android.app.Activity;
- import android.content.ComponentName;
- import android.content.ContentResolver;
- import android.content.Intent;
- import android.database.Cursor;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.net.Uri;
- import android.os.Bundle;
- import android.os.Environment;
- import android.provider.DocumentsContract;
- import android.provider.MediaStore;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.ImageView;
- public class MainActivity extends Activity implements OnClickListener {
- private Button mButton;
- private Button mPButton;
- private ImageView mImageView;
- private EditText mEditText;
- private Uri mUri;
- private Bitmap bitmap;
- private String mUrl;
- private static final int SELECT_PIC_KITKAT = 1;
- private static final int SELECT_PIC = 2;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mButton = (Button) findViewById(R.id.button);
- mPButton = (Button) findViewById(R.id.picture);
- mImageView = (ImageView) findViewById(R.id.imageview);
- mEditText = (EditText) findViewById(R.id.editetxt);
- mPButton.setOnClickListener(this);
- mButton.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Intent intent = new Intent();
- switch (v.getId()) {
- case R.id.button:
- // 分享到朋友聊天里
- String text = mEditText.getText().toString();
- File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
- File file = new File(dir, "1.jpg");
- File file2 = new File(mUri.getPath());
- File file3 = new File(mUrl);
- Log.i("uri111", mUri.getPath());
- Log.i("ur222", file.getPath());
- Log.i("uri--file", Uri.fromFile(file)+"");
- Log.i("file--getpath", Uri.fromFile(file2)+"");
- Log.i("file3--3333", Uri.fromFile(file3)+"");
- // shareToTimeLine(file3);
- shareToFriend(text,file3);
- break;
- case R.id.picture:
- intent.setType("image/*");
- intent.setAction(Intent.ACTION_GET_CONTENT);
- if(android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.KITKAT){
- startActivityForResult(intent, SELECT_PIC_KITKAT);
- }else{
- startActivityForResult(intent, SELECT_PIC);
- }
- break;
- default:
- break;
- }
- }
- /**
- * 分享信息到朋友
- *
- * @param file,假如图片的路径为path,那么file = new File(path);
- */
- private void shareToFriend(String text,File file) {
- Intent intent = new Intent();
- ComponentName componentName = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");
- intent.setComponent(componentName);
- intent.setAction(Intent.ACTION_SEND);
- intent.setType("image/*");
- intent.putExtra(Intent.EXTRA_TEXT, text);
- intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
- startActivity(intent);
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // TODO Auto-generated method stub
- if (resultCode != RESULT_OK) { //此处的 RESULT_OK 是系统自定义得一个常量
- Log.e("onActivityResult","ActivityResult resultCode error");
- return;
- }
- switch (requestCode) {
- case SELECT_PIC_KITKAT:
- mUrl = PicturePickerUtil.getPath(this, data);
- break;
- case SELECT_PIC:
- mUrl = PicturePickerUtil.selectImage(this, data);
- break;
- default:
- break;
- }
- // if (resultCode == RESULT_OK) {
- // if (DocumentsContract.isDocumentUri(this, data.getData())) {//返回true就是4.4以上,返回false就是4.3一下
- // mUrl = PicturePickerUtil.getPath(this, data);
- // }else {
- // mUrl = PicturePickerUtil.selectImage(this, data);
- // }
- mUri = data.getData();
- // Log.i("ur333", Uri.parse(data.getDataString()).getPath());
- // Log.i("uri", data.getDataString());
- findFile(data.getDataString());
- ContentResolver cr = this.getContentResolver();
- try {
- bitmap = BitmapFactory.decodeStream(cr
- .openInputStream(mUri));
- // /* 将Bitmap设定到ImageView */
- mImageView.setImageBitmap(bitmap);
- } catch (FileNotFoundException e) {
- Log.e("Exception", e.getMessage(), e);
- }
- // }
- super.onActivityResult(requestCode, resultCode, data);
- }
- private void shareToTimeLine(File file) {
- Intent intent = new Intent();
- ComponentName componentName = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI");
- intent.setComponent(componentName);
- intent.setAction(Intent.ACTION_SEND);
- intent.setType("image/*");
- intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
- startActivity(intent);
- }
- }
工具类
- package com.example.sharedemo;
- import android.content.ContentUris;
- import android.content.Context;
- import android.content.Intent;
- import android.database.Cursor;
- import android.net.Uri;
- import android.os.Build;
- import android.os.Environment;
- import android.provider.DocumentsContract;
- import android.provider.MediaStore;
- public class PicturePickerUtil {
- /**
- * 旧版 4.3(包括4.3)一下的图片地址获取
- * @param context
- * @param data
- * @return 图片地址
- */
- public static String selectImage(Context context,Intent data){
- Uri selectedImage = data.getData();
- // Log.e(TAG, selectedImage.toString());
- if(selectedImage!=null){
- String uriStr=selectedImage.toString();
- String path=uriStr.substring(10,uriStr.length());
- if(path.startsWith("com.sec.android.gallery3d")){
- // Log.e(TAG, "It's auto backup pic path:"+selectedImage.toString());
- return null;
- }
- }
- String[] filePathColumn = { MediaStore.Images.Media.DATA };
- Cursor cursor = context.getContentResolver().query(selectedImage,filePathColumn, null, null, null);
- cursor.moveToFirst();
- int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
- String picturePath = cursor.getString(columnIndex);
- cursor.close();
- return picturePath;
- }
- /**
- * 4.4(包括4.4)以上的图片地址获取
- * @param context
- * @param uri
- * @return 返回图片地址
- */
- public static String getPath(final Context context, Intent data) {
- final Uri uri = data.getData();
- final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
- // DocumentProvider
- if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
- if (isExternalStorageDocument(uri)) {
- final String docId = DocumentsContract.getDocumentId(uri);
- final String[] split = docId.split(":");
- final String type = split[0];
- if ("primary".equalsIgnoreCase(type)) {
- return Environment.getExternalStorageDirectory() + "/" + split[1];
- }
- // TODO handle non-primary volumes
- }
- // DownloadsProvider
- else if (isDownloadsDocument(uri)) {
- final String id = DocumentsContract.getDocumentId(uri);
- final Uri contentUri = ContentUris.withAppendedId(
- Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
- return getDataColumn(context, contentUri, null, null);
- }
- // MediaProvider
- else if (isMediaDocument(uri)) {
- final String docId = DocumentsContract.getDocumentId(uri);
- final String[] split = docId.split(":");
- final String type = split[0];
- Uri contentUri = null;
- if ("image".equals(type)) {
- contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
- } else if ("video".equals(type)) {
- contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
- } else if ("audio".equals(type)) {
- contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
- }
- final String selection = "_id=?";
- final String[] selectionArgs = new String[] {
- split[1]
- };
- return getDataColumn(context, contentUri, selection, selectionArgs);
- }
- }
- // MediaStore (and general)
- else if ("content".equalsIgnoreCase(uri.getScheme())) {
- // Return the remote address
- if (isGooglePhotosUri(uri))
- return uri.getLastPathSegment();
- return getDataColumn(context, uri, null, null);
- }
- // File
- else if ("file".equalsIgnoreCase(uri.getScheme())) {
- return uri.getPath();
- }
- return null;
- }
- /**
- * Get the value of the data column for this Uri. This is useful for
- * MediaStore Uris, and other file-based ContentProviders.
- *
- * @param context The context.
- * @param uri The Uri to query.
- * @param selection (Optional) Filter used in the query.
- * @param selectionArgs (Optional) Selection arguments used in the query.
- * @return The value of the _data column, which is typically a file path.
- */
- public static String getDataColumn(Context context, Uri uri, String selection,
- String[] selectionArgs) {
- Cursor cursor = null;
- final String column = "_data";
- final String[] projection = {
- column
- };
- try {
- cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
- null);
- if (cursor != null && cursor.moveToFirst()) {
- final int index = cursor.getColumnIndexOrThrow(column);
- return cursor.getString(index);
- }
- } finally {
- if (cursor != null)
- cursor.close();
- }
- return null;
- }
- /**
- * @param uri The Uri to check.
- * @return Whether the Uri authority is ExternalStorageProvider.
- */
- public static boolean isExternalStorageDocument(Uri uri) {
- return "com.android.externalstorage.documents".equals(uri.getAuthority());
- }
- /**
- * @param uri The Uri to check.
- * @return Whether the Uri authority is DownloadsProvider.
- */
- public static boolean isDownloadsDocument(Uri uri) {
- return "com.android.providers.downloads.documents".equals(uri.getAuthority());
- }
- /**
- * @param uri The Uri to check.
- * @return Whether the Uri authority is MediaProvider.
- */
- public static boolean isMediaDocument(Uri uri) {
- return "com.android.providers.media.documents".equals(uri.getAuthority());
- }
- /**
- * @param uri The Uri to check.
- * @return Whether the Uri authority is Google Photos.
- */
- public static boolean isGooglePhotosUri(Uri uri) {
- return "com.google.android.apps.photos.content".equals(uri.getAuthority());
- }
- }
XML文件
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- android:orientation="vertical"
- tools:context="com.example.sharedemo.MainActivity" >
- <ImageView
- android:id="@+id/imageview"
- android:layout_width="50dp"
- android:layout_height="50dp"
- android:contentDescription="图片"
- />
- <EditText
- android:id="@+id/editetxt"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="要分享的文字"
- />
- <Button
- android:id="@+id/picture"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="picture"
- />
- <Button
- android:id="@+id/button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="share" />
- </LinearLayout>
大功告成。仅用于学习交流,下班着急回家,代码有很多不足之处请见谅。不过,亲测可行。。