Android 微信分享

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

 所以,简单包装一下,跳转到微信朋友分享的界面的代码就是
[java]  view plain copy print ?
  1. Intent intent = new Intent();  
  2.         ComponentName componentName = new ComponentName("com.tencent.mm""com.tencent.mm.ui.tools.ShareImgUI");  
  3.         intent.setComponent(componentName);  
  4.         intent.setAction(Intent.ACTION_SEND);  
  5.           
  6. startActivity(intent);  

我跳,我跳,我跳跳跳。。才发现界面下面有Toast提示。
好吧,分享嘛,就要有分享数据,不然分享啥呢。哈哈。微信真是太聪明了。还是老老实实的加上数据吧。于是乎一番折腾。有了下面的方法。
[java]  view plain copy print ?
  1. private void toFriend(String text,File file) {  
  2.         Intent intent = new Intent();  
  3.         ComponentName componentName = new ComponentName("com.tencent.mm""com.tencent.mm.ui.tools.ShareImgUI");  
  4.         intent.setComponent(componentName);  
  5.         intent.setAction(Intent.ACTION_SEND);  
  6.         intent.setType("image/*");  
  7.         intent.putExtra(Intent.EXTRA_TEXT, text);  
  8.         intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));  
  9.         startActivity(intent);  
  10.     }  

那么分享朋友圈也是差不多了。继续贴代码。
[java]  view plain copy print ?
  1. private void toTimeLine(File file) {    
  2.         Intent intent = new Intent();    
  3.         ComponentName componentName = new ComponentName("com.tencent.mm""com.tencent.mm.ui.tools.ShareToTimeLineUI");    
  4.         intent.setComponent(componentName);    
  5.         intent.setAction(Intent.ACTION_SEND);    
  6.         intent.setType("image/*");    
  7.         intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));    
  8.         startActivity(intent);    
  9.     }  

OK,大功告成了。可是,这里又遇到了一个问题。就是在选择图片时,获取到得uri问题。Android在 4.3返回的是带文件路径的,而4.4返回的却是content://com.android.providers.media.documents/document/image:3951这样的。就是说,4.4以上获取到得uri不能用来剪裁,上传,分享等操作。又是一顿百度,找到了这篇文章。Android 4.4从图库选择图片,获取图片路径并裁剪。千古文章一大抄,抄来抄去有提高。
解决了我纠结一下午的难题。上代码
[java]  view plain copy print ?
  1. package com.example.sharedemo;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileWriter;  
  6. import java.io.IOException;  
  7. import java.sql.Date;  
  8.   
  9. import android.R.integer;  
  10. import android.app.Activity;  
  11. import android.content.ComponentName;  
  12. import android.content.ContentResolver;  
  13. import android.content.Intent;  
  14. import android.database.Cursor;  
  15. import android.graphics.Bitmap;  
  16. import android.graphics.BitmapFactory;  
  17. import android.net.Uri;  
  18. import android.os.Bundle;  
  19. import android.os.Environment;  
  20. import android.provider.DocumentsContract;  
  21. import android.provider.MediaStore;  
  22. import android.util.Log;  
  23. import android.view.View;  
  24. import android.view.View.OnClickListener;  
  25. import android.widget.Button;  
  26. import android.widget.EditText;  
  27. import android.widget.ImageView;  
  28.   
  29. public class MainActivity extends Activity implements OnClickListener {  
  30.   
  31.     private Button mButton;  
  32.     private Button mPButton;  
  33.     private ImageView mImageView;  
  34.     private EditText mEditText;  
  35.     private Uri mUri;  
  36.     private Bitmap bitmap;  
  37.     private String mUrl;  
  38.     private static final int SELECT_PIC_KITKAT = 1;  
  39.     private static final int SELECT_PIC = 2;  
  40.       
  41.   
  42.     @Override  
  43.     protected void onCreate(Bundle savedInstanceState) {  
  44.         super.onCreate(savedInstanceState);  
  45.         setContentView(R.layout.activity_main);  
  46.         mButton = (Button) findViewById(R.id.button);  
  47.         mPButton = (Button) findViewById(R.id.picture);  
  48.         mImageView = (ImageView) findViewById(R.id.imageview);  
  49.         mEditText = (EditText) findViewById(R.id.editetxt);  
  50.         mPButton.setOnClickListener(this);  
  51.         mButton.setOnClickListener(this);  
  52.     }  
  53.   
  54.     @Override  
  55.     public void onClick(View v) {  
  56.         // TODO Auto-generated method stub  
  57.         Intent intent = new Intent();  
  58.         switch (v.getId()) {  
  59.         case R.id.button:  
  60.             // 分享到朋友聊天里  
  61.             String text = mEditText.getText().toString();  
  62.             File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);  
  63.             File file = new File(dir, "1.jpg");  
  64.             File file2 = new File(mUri.getPath());  
  65.             File file3 = new File(mUrl);  
  66.             Log.i("uri111", mUri.getPath());  
  67.             Log.i("ur222", file.getPath());  
  68.             Log.i("uri--file", Uri.fromFile(file)+"");  
  69.             Log.i("file--getpath", Uri.fromFile(file2)+"");  
  70.             Log.i("file3--3333", Uri.fromFile(file3)+"");  
  71. //          shareToTimeLine(file3);  
  72.             shareToFriend(text,file3);  
  73.             break;  
  74.         case R.id.picture:  
  75.             intent.setType("image/*");  
  76.             intent.setAction(Intent.ACTION_GET_CONTENT);  
  77.             if(android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.KITKAT){                    
  78.                 startActivityForResult(intent, SELECT_PIC_KITKAT);      
  79.         }else{                  
  80.                 startActivityForResult(intent, SELECT_PIC);     
  81.         }    
  82.   
  83.             break;  
  84.   
  85.         default:  
  86.             break;  
  87.         }  
  88.     }  
  89.     /**  
  90.      * 分享信息到朋友  
  91.      *   
  92.      * @param file,假如图片的路径为path,那么file = new File(path);  
  93.      */  
  94.     private void shareToFriend(String text,File file) {  
  95.         Intent intent = new Intent();  
  96.         ComponentName componentName = new ComponentName("com.tencent.mm""com.tencent.mm.ui.tools.ShareImgUI");  
  97.         intent.setComponent(componentName);  
  98.         intent.setAction(Intent.ACTION_SEND);  
  99.         intent.setType("image/*");  
  100.         intent.putExtra(Intent.EXTRA_TEXT, text);  
  101.         intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));  
  102.         startActivity(intent);  
  103.     }  
  104.   
  105.     @Override  
  106.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  107.         // TODO Auto-generated method stub  
  108.         if (resultCode != RESULT_OK) {        //此处的 RESULT_OK 是系统自定义得一个常量  
  109.             Log.e("onActivityResult","ActivityResult resultCode error");  
  110.             return;  
  111.         }  
  112.           
  113.         switch (requestCode) {  
  114.         case SELECT_PIC_KITKAT:  
  115.             mUrl = PicturePickerUtil.getPath(this, data);  
  116.             break;  
  117.         case SELECT_PIC:  
  118.             mUrl = PicturePickerUtil.selectImage(this, data);  
  119.             break;  
  120.         default:  
  121.             break;  
  122.         }  
  123.           
  124.           
  125. //      if (resultCode == RESULT_OK) {  
  126. //          if (DocumentsContract.isDocumentUri(this, data.getData())) {//返回true就是4.4以上,返回false就是4.3一下  
  127. //              mUrl = PicturePickerUtil.getPath(this, data);  
  128. //          }else {  
  129. //              mUrl = PicturePickerUtil.selectImage(this, data);  
  130. //          }  
  131.             mUri = data.getData();  
  132. //          Log.i("ur333", Uri.parse(data.getDataString()).getPath());  
  133. //          Log.i("uri", data.getDataString());  
  134.             findFile(data.getDataString());  
  135.             ContentResolver cr = this.getContentResolver();  
  136.             try {  
  137.                 bitmap = BitmapFactory.decodeStream(cr  
  138.                         .openInputStream(mUri));  
  139. //              /* 将Bitmap设定到ImageView */  
  140.                 mImageView.setImageBitmap(bitmap);  
  141.             } catch (FileNotFoundException e) {  
  142.                 Log.e("Exception", e.getMessage(), e);  
  143.             }  
  144. //      }  
  145.         super.onActivityResult(requestCode, resultCode, data);  
  146.           
  147.     }  
  148.   
  149.     private void shareToTimeLine(File file) {    
  150.         Intent intent = new Intent();    
  151.         ComponentName componentName = new ComponentName("com.tencent.mm""com.tencent.mm.ui.tools.ShareToTimeLineUI");    
  152.         intent.setComponent(componentName);    
  153.         intent.setAction(Intent.ACTION_SEND);    
  154.         intent.setType("image/*");    
  155.         intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));    
  156.         startActivity(intent);    
  157.     }    
  158.           
  159.       
  160. }  

工具类
[java]  view plain copy print ?
  1. package com.example.sharedemo;  
  2.   
  3. import android.content.ContentUris;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.database.Cursor;  
  7. import android.net.Uri;  
  8. import android.os.Build;  
  9. import android.os.Environment;  
  10. import android.provider.DocumentsContract;  
  11. import android.provider.MediaStore;  
  12.   
  13. public class PicturePickerUtil {  
  14.     /** 
  15.      * 旧版 4.3(包括4.3)一下的图片地址获取 
  16.      * @param context 
  17.      * @param data 
  18.      * @return 图片地址 
  19.      */  
  20.     public static String selectImage(Context context,Intent data){  
  21.         Uri selectedImage = data.getData();  
  22. //      Log.e(TAG, selectedImage.toString());  
  23.         if(selectedImage!=null){              
  24.             String uriStr=selectedImage.toString();  
  25.             String path=uriStr.substring(10,uriStr.length());  
  26.             if(path.startsWith("com.sec.android.gallery3d")){  
  27. //              Log.e(TAG, "It's auto backup pic path:"+selectedImage.toString());  
  28.                 return null;  
  29.             }  
  30.         }         
  31.         String[] filePathColumn = { MediaStore.Images.Media.DATA };  
  32.         Cursor cursor = context.getContentResolver().query(selectedImage,filePathColumn, nullnullnull);  
  33.         cursor.moveToFirst();  
  34.         int columnIndex = cursor.getColumnIndex(filePathColumn[0]);  
  35.         String picturePath = cursor.getString(columnIndex);  
  36.         cursor.close();  
  37.         return picturePath;       
  38.     }  
  39.     /** 
  40.      * 4.4(包括4.4)以上的图片地址获取 
  41.      * @param context 
  42.      * @param uri 
  43.      * @return 返回图片地址 
  44.      */  
  45.     public static String getPath(final Context context, Intent data) {  
  46.         final Uri uri = data.getData();  
  47.         final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;  
  48.   
  49.         // DocumentProvider  
  50.         if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {  
  51.             if (isExternalStorageDocument(uri)) {  
  52.                 final String docId = DocumentsContract.getDocumentId(uri);  
  53.                 final String[] split = docId.split(":");  
  54.                 final String type = split[0];  
  55.   
  56.                 if ("primary".equalsIgnoreCase(type)) {  
  57.                     return Environment.getExternalStorageDirectory() + "/" + split[1];  
  58.                 }  
  59.   
  60.                 // TODO handle non-primary volumes  
  61.             }  
  62.             // DownloadsProvider  
  63.             else if (isDownloadsDocument(uri)) {  
  64.   
  65.                 final String id = DocumentsContract.getDocumentId(uri);  
  66.                 final Uri contentUri = ContentUris.withAppendedId(  
  67.                         Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));  
  68.   
  69.                 return getDataColumn(context, contentUri, nullnull);  
  70.             }  
  71.             // MediaProvider  
  72.             else if (isMediaDocument(uri)) {  
  73.                 final String docId = DocumentsContract.getDocumentId(uri);  
  74.                 final String[] split = docId.split(":");  
  75.                 final String type = split[0];  
  76.   
  77.                 Uri contentUri = null;  
  78.                 if ("image".equals(type)) {  
  79.                     contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;  
  80.                 } else if ("video".equals(type)) {  
  81.                     contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;  
  82.                 } else if ("audio".equals(type)) {  
  83.                     contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;  
  84.                 }  
  85.   
  86.                 final String selection = "_id=?";  
  87.                 final String[] selectionArgs = new String[] {  
  88.                         split[1]  
  89.                 };  
  90.   
  91.                 return getDataColumn(context, contentUri, selection, selectionArgs);  
  92.             }  
  93.         }  
  94.         // MediaStore (and general)  
  95.         else if ("content".equalsIgnoreCase(uri.getScheme())) {  
  96.   
  97.             // Return the remote address  
  98.             if (isGooglePhotosUri(uri))  
  99.                 return uri.getLastPathSegment();  
  100.   
  101.             return getDataColumn(context, uri, nullnull);  
  102.         }  
  103.         // File  
  104.         else if ("file".equalsIgnoreCase(uri.getScheme())) {  
  105.             return uri.getPath();  
  106.         }  
  107.   
  108.         return null;  
  109.     }  
  110.   
  111.     /** 
  112.      * Get the value of the data column for this Uri. This is useful for 
  113.      * MediaStore Uris, and other file-based ContentProviders. 
  114.      * 
  115.      * @param context The context. 
  116.      * @param uri The Uri to query. 
  117.      * @param selection (Optional) Filter used in the query. 
  118.      * @param selectionArgs (Optional) Selection arguments used in the query. 
  119.      * @return The value of the _data column, which is typically a file path. 
  120.      */  
  121.     public static String getDataColumn(Context context, Uri uri, String selection,  
  122.             String[] selectionArgs) {  
  123.   
  124.         Cursor cursor = null;  
  125.         final String column = "_data";  
  126.         final String[] projection = {  
  127.                 column  
  128.         };  
  129.   
  130.         try {  
  131.             cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,  
  132.                     null);  
  133.             if (cursor != null && cursor.moveToFirst()) {  
  134.                 final int index = cursor.getColumnIndexOrThrow(column);  
  135.                 return cursor.getString(index);  
  136.             }  
  137.         } finally {  
  138.             if (cursor != null)  
  139.                 cursor.close();  
  140.         }  
  141.         return null;  
  142.     }  
  143.   
  144.   
  145.     /** 
  146.      * @param uri The Uri to check. 
  147.      * @return Whether the Uri authority is ExternalStorageProvider. 
  148.      */  
  149.     public static boolean isExternalStorageDocument(Uri uri) {  
  150.         return "com.android.externalstorage.documents".equals(uri.getAuthority());  
  151.     }  
  152.   
  153.     /** 
  154.      * @param uri The Uri to check. 
  155.      * @return Whether the Uri authority is DownloadsProvider. 
  156.      */  
  157.     public static boolean isDownloadsDocument(Uri uri) {  
  158.         return "com.android.providers.downloads.documents".equals(uri.getAuthority());  
  159.     }  
  160.   
  161.     /** 
  162.      * @param uri The Uri to check. 
  163.      * @return Whether the Uri authority is MediaProvider. 
  164.      */  
  165.     public static boolean isMediaDocument(Uri uri) {  
  166.         return "com.android.providers.media.documents".equals(uri.getAuthority());  
  167.     }  
  168.   
  169.     /** 
  170.      * @param uri The Uri to check. 
  171.      * @return Whether the Uri authority is Google Photos. 
  172.      */  
  173.     public static boolean isGooglePhotosUri(Uri uri) {  
  174.         return "com.google.android.apps.photos.content".equals(uri.getAuthority());  
  175.     }  
  176.   
  177. }  


XML文件

[html]  view plain copy print ?
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     android:orientation="vertical"  
  10.     tools:context="com.example.sharedemo.MainActivity" >  
  11.     <ImageView   
  12.         android:id="@+id/imageview"  
  13.         android:layout_width="50dp"  
  14.         android:layout_height="50dp"  
  15.         android:contentDescription="图片"  
  16.         />  
  17.     <EditText   
  18.         android:id="@+id/editetxt"  
  19.         android:layout_width="match_parent"  
  20.         android:layout_height="wrap_content"  
  21.         android:hint="要分享的文字"  
  22.         />  
  23.       
  24.     <Button   
  25.         android:id="@+id/picture"  
  26.         android:layout_width="wrap_content"  
  27.         android:layout_height="wrap_content"  
  28.         android:text="picture"   
  29.         />  
  30.       
  31.   
  32.     <Button  
  33.         android:id="@+id/button"  
  34.         android:layout_width="wrap_content"  
  35.         android:layout_height="wrap_content"  
  36.         android:text="share" />  
  37.   
  38. </LinearLayout>  


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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值