分类

链接

2017 年 12 月
 123
45678910
11121314151617
18192021222324
25262728293031

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > Android > 正文
共享办公室出租
android集成微信分享
Android 暂无评论 阅读(554)

在APP中集成微信的分享功能,官方的说明是在太简洁了.....几乎没法用....

不过一开始按照官方文档去做没问题

1.注册你的APP

登录 微信开放平台 把你的开发者信息填上,这些就不上图了,都是中文字,应该看得懂
然后进入 管理中心 点击创建++移动应用++

创建移动应用

把你的应用信息填上,有些项目不知道怎么填随便填就行了,但是注意: 应用的包名和签名不能随便填!!

  • 包名就是你的应用的包名例如: fucker.idiot.asshole.wanker

怎么获取签名?

先下载微信提供的一些工具

工具

首先将你的app安装在手机或者模拟器上,

由于平时我们调试软件都是使用debug的签名生成应用,所以我们要特别注意如果使用了debug的签名,等到APP正式发布的时候,微信的分享就不能用了.
所以我们要使用release的签名文件
怎么让我们debug的时候也使用release的签名文件呢?

打开应用Module的build.gradle文件 添加这样一份代码:

android {
    signingConfigs{
        debug{  <span class="hljs-comment">//这里配置的就是debug的签名配置了</span>
            storeFile file(<span class="hljs-string">"C:<span class="hljs-subst">\\</span>Users<span class="hljs-subst">\\</span>Administrator<span class="hljs-subst">\\</span>.android<span class="hljs-subst">\\</span>asd"</span>)   <span class="hljs-comment">//这个文件是我的,改成你自己的release签名文件</span>
            storePassword <span class="hljs-string">"asd123456"</span>   <span class="hljs-comment">//密码改成自己的</span>
            keyAlias <span class="hljs-string">"asd"</span>              <span class="hljs-comment">//再改成你自己的</span>
            keyPassword <span class="hljs-string">"asd123456"</span>     <span class="hljs-comment">//再改成你自己的</span>
        }
    }
}

再使用工具包中的软件便可以获取到应用的签名了,

填上应用的包名,然后"Get Signature"

获取签名

绿色的字就是签名

最后等待审核,可能要一两天把...

通过审核是这样的

通过审核

当然要把 AppID 和 AppSecret 记录下来,在代码中需要使用

appid

++注意如果临时改变了签名或者包名,当时还不能生效(也就是你APP用不了微信的功能了),可能得等个一天才能生效!!!!血的教训!!++


2.添加依赖包

之前下载获取签名工具的时候就已经下载下来了

依赖包

放入AS项目的libs文件夹中

添加依赖

添加依赖

3.向微信sdk注册你的应用

在我自己写的学习demo中,注册是在一个单例模式的类中注册的,只有在第一次使用的时候才会注册,免得提早注册了浪费资源

当然你也可以在application或者activity的oncrete中注册,随你!

<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">String</span> APP_ID = <span class="hljs-string">"12312313212313213213"</span>;    <span class="hljs-comment">//这个APP_ID就是注册APP的时候生成的</span>

<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">String</span> APP_SECRET = <span class="hljs-string">"12312312313212313213213"</span>;

<span class="hljs-keyword">public</span> IWXAPI api;      <span class="hljs-comment">//这个对象是专门用来向微信发送数据的一个重要接口,使用强引用持有,所有的信息发送都是基于这个对象的</span>

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> registerWeChat(Context context) {   <span class="hljs-comment">//向微信注册app</span>
    api = WXAPIFactory.createWXAPI(context, APP_ID, <span class="hljs-keyword">true</span>);  
    api.registerApp(APP_ID);        
}


4.发送图片或文字,给朋友或者朋友圈

因为发文字,图片,或者链接都是类同的程序,所以在这只举一个发送图片的例子

<span class="hljs-keyword">public</span> <span class="hljs-literal">void</span> sharePicByFile(File picFile, <span class="hljs-built_in">String</span> <span class="hljs-built_in">tag</span>) {
    <span class="hljs-keyword">if</span> (!picFile.exists()) {<span class="hljs-keyword">return</span>;}
    Bitmap pic = BitmapFactory.decodeFile(picFile.toString());
    
    WXImageObject imageObject = <span class="hljs-literal">new</span> WXImageObject(pic);
    <span class="hljs-comment">//这个构造方法中自动把传入的bitmap转化为2进制数据,或者你直接传入byte[]也行</span>
    <span class="hljs-comment">//注意传入的数据不能大于10M,开发文档上写的</span>
    
    WXMediaMessage msg = <span class="hljs-literal">new</span> WXMediaMessage();  <span class="hljs-comment">//这个对象是用来包裹发送信息的对象</span>
    msg.mediaObject = imageObject;
    <span class="hljs-comment">//msg.mediaObject实际上是个IMediaObject对象,</span>
    <span class="hljs-comment">//它有很多实现类,每一种实现类对应一种发送的信息,</span>
    <span class="hljs-comment">//比如WXTextObject对应发送的信息是文字,想要发送文字直接传入WXTextObject对象就行</span>
    
    

    Bitmap thumbBitmap = Bitmap.createScaledBitmap(pic, <span class="hljs-number">150</span>, <span class="hljs-number">150</span>, <span class="hljs-literal">true</span>);
    
    msg.thumbData = bitmap2ByteArray(thumbBitmap);  
    <span class="hljs-comment">//在这设置缩略图</span>
    <span class="hljs-comment">//官方文档介绍这个bitmap不能超过32kb</span>
    <span class="hljs-comment">//如果一个像素是8bit的话换算成正方形的bitmap则边长不超过181像素,边长设置成150是比较保险的</span>
    <span class="hljs-comment">//或者使用msg.setThumbImage(thumbBitmap);省去自己转换二进制数据的过程</span>
    <span class="hljs-comment">//如果超过32kb则抛异常</span>

    SendMessageToWX.Req req = <span class="hljs-literal">new</span> SendMessageToWX.Req();    <span class="hljs-comment">//创建一个请求对象</span>
    req.message = msg;  <span class="hljs-comment">//把msg放入请求对象中</span>
    req.scene = SendMessageToWX.Req.WXSceneTimeline;    <span class="hljs-comment">//设置发送到朋友圈</span>
    <span class="hljs-comment">//req.scene = SendMessageToWX.Req.WXSceneSession;   //设置发送给朋友</span>
    req.transaction = <span class="hljs-built_in">tag</span>;  <span class="hljs-comment">//这个tag要唯一,用于在回调中分辨是哪个分享请求</span>
    <span class="hljs-built_in">boolean</span> b = api.sendReq(req);   <span class="hljs-comment">//如果调用成功微信,会返回true</span>
}

调用这个方法之后会自动打开微信的界面,可以发送你要分享的信息了!


5.分享后的回调

微信只能回调指定包下的指定Activity!!!

所以一定要按照我下面的例子来写

(1)创建包

在注册的包名下面创建一个叫"wxapi"的包

<span class="hljs-selector-tag">package</span> <span class="hljs-selector-tag">com</span><span class="hljs-selector-class">.zhouyijin</span><span class="hljs-selector-class">.zyj</span><span class="hljs-selector-class">.fakeshanbay</span><span class="hljs-selector-class">.wxapi</span>;

(2)创建指定名字的Activity

创建一个Acitivty,必须是这个名字!#### (3)

public <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">WXEntryActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AppCompatActivity</span> </span>{}

并在manifest文件中注册!!!

&lt;activity <span class="hljs-string">android:</span>name=<span class="hljs-string">".wxapi.WXEntryActivity"</span>
<span class="hljs-symbol">    android:</span>launchMode=<span class="hljs-string">"singleTop"</span>
<span class="hljs-symbol">    android:</span>exported=<span class="hljs-string">"true"</span><span class="hljs-regexp">/&gt;   /</span>/注意这个属性一定是<span class="hljs-literal">true</span>,不然微信不能调用

(3)处理回调

微信会把数据包装在Intent中传入这个"WXEntryActivity"中

我们不需要自己处理Intent,

只需要在这个activity中调用api.handleIntent(Intent intent, IWXAPIEventHandler i),
这个方法会自动调用 IWXAPIEventHandler 对象的 onResp(BaseResp resp) 方法
我们只需要把处理回调的逻辑写进onResp(BaseResp resp) 方法中即可!

为了方便,我们使WXEntryActivity实现IWXAPIEventHandler的方法

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">WXEntryActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AppCompatActivity</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">IWXAPIEventHandler</span> {</span>

    <span class="hljs-meta">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> onCreate(Bundle savedInstanceState) {
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        setContentView(R.layout.entry);
        WeChatModule.getInstance().api.handleIntent(getIntent(), <span class="hljs-keyword">this</span>); <span class="hljs-comment">//处理微信传回的Intent,当然你也可以在别的地方处理</span>
    }
    
    <span class="hljs-meta">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> onResp(BaseResp resp) { <span class="hljs-comment">//在这个方法中处理微信传回的数据</span>
        <span class="hljs-comment">//形参resp 有下面两个个属性比较重要</span>
        <span class="hljs-comment">//1.resp.errCode</span>
        <span class="hljs-comment">//2.resp.transaction则是在分享数据的时候手动指定的字符创,用来分辨是那次分享(参照4.中req.transaction)</span>
        <span class="hljs-keyword">switch</span> (resp.errCode) { <span class="hljs-comment">//根据需要的情况进行处理</span>
            <span class="hljs-keyword">case</span> BaseResp.ErrCode.<span class="hljs-string">ERR_OK:</span>
                <span class="hljs-comment">//正确返回</span>
                <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">case</span> BaseResp.ErrCode.<span class="hljs-string">ERR_USER_CANCEL:</span>
                <span class="hljs-comment">//用户取消</span>
                <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">case</span> BaseResp.ErrCode.<span class="hljs-string">ERR_AUTH_DENIED:</span>
                <span class="hljs-comment">//认证被否决</span>
                <span class="hljs-keyword">break</span>;
            <span class="hljs-keyword">case</span> BaseResp.ErrCode.<span class="hljs-string">ERR_SENT_FAILED:</span>
                <span class="hljs-comment">//发送失败</span>
                <span class="hljs-keyword">break</span>;    
            <span class="hljs-keyword">case</span> BaseResp.ErrCode.<span class="hljs-string">ERR_UNSUPPORT:</span>
                /不支持错误
                <span class="hljs-keyword">break</span>;    
            <span class="hljs-keyword">case</span> BaseResp.ErrCode.<span class="hljs-string">ERR_COMM:</span>
                <span class="hljs-comment">//一般错误</span>
                <span class="hljs-keyword">break</span>;       
<span class="hljs-symbol">            default:</span>
                <span class="hljs-comment">//其他不可名状的情况</span>
                <span class="hljs-keyword">break</span>;
        }
    }
    
    <span class="hljs-meta">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> onReq(BaseReq req) {
        <span class="hljs-comment">//......这里是用来处理接收的请求,暂不做讨论</span>
    }
    
}

这里需要提醒下,因为微信只能回调这个Activity,如果不想把业务逻辑写在这个Activity中,那么可以把具体逻辑再转移到别的Activity中处理,如下:

<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">onResp</span><span class="hljs-params">(BaseResp resp)</span> </span>{
    Intent intent = <span class="hljs-keyword">new</span> Intent(<span class="hljs-keyword">this</span>, xxx.class);
    intent.putExtra(<span class="hljs-string">"errCode"</span>, resp.errCode);
    intent.putExtra(<span class="hljs-string">"errStr"</span>, resp.transaction);
    startActivity(intent); 
    finish();
}

我宝贵的半天时间就浪费在这了,看过给个赞好吗


								

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:android集成微信分享 | Bruce's Blog

发表评论

留言无头像?