Intent(意图)主要是解决Android应用的各项组件之间的通讯。 Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。 因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。(此处省略N个字。。。。。。)。 没事找百度 就是说,Intent不光能开启本应用的其他界面,同样能打开手机上其他应用的界面,只要方法正确,everything will be true。 实践出真知,接下来就是见证奇迹的时刻。 首先确定一点,如何通过Intent,从一个应用打开另一个应用。就如我们经常看到的应用图标,手机桌面也是一个应用。所有安装的应用图标,都再桌面应用程序内。所以,从一个应用跳转到另一个应用的事情,我们每天都在做,比如打电话,比如发短信,QQ,微信,陌陌,豆瓣。。(此处继续省略N个字,博主经验有限,还需要跟大家多多探讨。学海无涯,回头是岸。) PS:有更好的东东私聊给我!! 转载请注明出处http://blog.csdn.net/gaoshouxiaodi/article/details/40589903 首先看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提示。 Android 微信分享,无需那么麻烦。_第1张图片 好吧,分享嘛,就要有分享数据,不然分享啥呢。哈哈。微信真是太聪明了。还是老老实实的加上数据吧。于是乎一番折腾。有了下面的方法。
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;@Overrideprotected 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);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent 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);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubif (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文件

                


大功告成。仅用于学习交流,下班着急回家,代码有很多不足之处请见谅。不过,亲测可行。。
源码下载

(不要迷恋哥,本文内容均来自互联网,不信你挨个字百度。)

更多相关文章

  1. Android 6.0以上权限拒绝打开权限设置界面
  2. Android学习之自定义控件之图片带文字的View
  3. Android与WebView本地上传图片问题
  4. Android的界面设计规范-1
  5. 从系统角度理解Android的界面绘制
  6. Android 中,应用程序需要的图片资源如何针对不同屏幕大小手机设计
  7. 一款用于在 Android 设备上获取照片(拍照或从相册、文件中选择)、

随机推荐

  1. Android 9.0 System.loadLibrary 的源码
  2. Windows下编译使用Android(安卓)NDK,调用S
  3. Android 中屏蔽 Home 键
  4. 列出sdcard里所有.mp3文件,并且可以点击
  5. [Android][MediaRecorder] Android(安卓)
  6. 【技术直通车】ArcGIS Runtime SDK for A
  7. ButterKnife初级用法
  8. java和Android文件下载断点续传和图片下
  9. android获取网络数据
  10. Android WiFi On/Off sequence diagram