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提示。 好吧,分享嘛,就要有分享数据,不然分享啥呢。哈哈。微信真是太聪明了。还是老老实实的加上数据吧。于是乎一番折腾。有了下面的方法。
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文件

<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>


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

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

更多相关文章

  1. [置顶] Android图片异步加载之Android-Universal-Image-Loader
  2. android 9PNG图片制作
  3. android webview内嵌网页js解析json 并根据json数据生成表单以及
  4. Android(安卓)高仿微信发朋友圈浏览图片效果
  5. android 显示图片的指定位置图像 ImageView ImageButton
  6. Android(安卓)图片内存溢出(Out of Memory)
  7. android批量文件上传(android批量图片上传)
  8. App启动时三种效果(黑屏白屏、背景图片、延迟加载)
  9. 使用内容提供器跨应用分享你的数据(1)

随机推荐

  1. android input system(frameworks) analy
  2. 如何在android虚拟机中安装APK
  3. android 获取 apk mainfest.xml中的信息
  4. Android菜鸟笔记-selector的使用
  5. Retrofit +OKHttp简单封装使用
  6. Android 应用软件开发(一)
  7. 阿拉伯语布局修改总结
  8. android退出系统的绝杀方法
  9. Android, repo sync经常失败的解决办法
  10. Android系统基础(02) 系统源码环境搭建