手记

图文详解Android心愿分享应用

一.App的功能包括:

  • 上传照片;
  • DIY专属祝福语;
  • 一键分享到票圈~

二.准备工作
分析xml的样式布局,采用绝对布局RelativeLayout,我们可以容易处理各个组件之间的位置关系,包括两个ImageView存放图片,一个Button作为分享,还有一个EditText输入新年心愿

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:background="@drawable/bg"
    tools:context="demo.linhao.com.springcart.MainActivity">
    <ImageView
        android:id="@+id/photo"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:layout_centerHorizontal="true"
        android:background="#e10d0d"
        android:src="@drawable/ic_launcher"
        android:padding="3dp"
        android:layout_marginTop="80dp"/>
    <EditText
        android:id="@+id/words"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/photo"
        android:background="@drawable/send_btn_pressed"
        android:layout_centerHorizontal="true"
        android:hint="写下您的新年愿望"
        android:gravity="center"
        android:layout_marginTop="70dp"/>
    <Button
        android:id="@+id/share"
        android:layout_width="90dp"
        android:layout_height="50dp"
        android:background="@drawable/share"
        android:layout_marginTop="30dp"
        android:layout_below="@id/words"
        android:layout_centerHorizontal="true"
        />
    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:background="@drawable/logo"
        android:layout_below="@id/photo"
        android:layout_toRightOf="@id/words"
        android:padding="3dp"
        android:layout_marginTop="20dp"/>

</RelativeLayout>

三、直接在清单文件设置主题是无标题全屏

 <activity android:name=".MainActivity"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen">

四、第一个功能--上传本地图库相册
首先在MainActivity这个主activity文件先初始化ImageView控件,接着设置它的点击事件,这里直接用匿名类重写onClick方法,
紧接着创建Intent对象,通过隐式的启动方式获取系统图库的信息,action参数我们使用系统提供打开图像的常量ACTION_PICK,第二个是uri,直接传入null就行了

new Intent(Intent.ACTION_PICK,null);

这里我们使用startActivityForResult带有返回结果这个方法,然后覆盖onActivityResult去处理返回结果

 startActivityForResult(intent,100);
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == 100)
        {
            if (data != null)
            {
                mPhoto.setImageURI(data.getData());
            }
        }

setDataAndType()这个方法从字面我们就知道它接收date和type

                intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");

MediaStore.Images.Media.EXTERNAL_CONTENT_URI 获取系统图库的信息 ,系统默认的MediaStore的uri地址, type使用标准的mime,下面是完整的代码

 mPhoto = (ImageView) findViewById(R.id.photo);
        mPhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK,null);

                intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
                startActivityForResult(intent,100);
            }
        });
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == 100)
        {
            if (data != null)
            {
                mPhoto.setImageURI(data.getData());
            }
        }
    }

五、修改系统默认字体:
创建一个assets目录,在fonts文件下存放我们自定义的字体文件,用createFromAsset的接口生成新的typeface

createFromAsset(AssetManager mgr, String path)

通过getAssets()获取getAssets获取AssetManager,第二个参数传入自定义的字体库文件

         mWords = (EditText) findViewById(R.id.words);
        mWords.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/test.ttf"));

六、到了分享到朋友圈这一环节了~
首先,你得先在微信开放者平台注册一个账号

https://open.weixin.qq.com

紧接着你就可以创建属于自己的应用了

等等,这里有一些注意事项哦:

  • 系统会让你输入你的应用包名,这里必须填写你程序的包名,否则将无法调试

如何获得应用签名呢?大家可以在官网找到下载链接,地址如下,然后把apk安装到自个的真机上,还有你的应用打包后的apk,这样就可以在Gen_Signature_Android221cbf这个应用上填写自己的应用包名,系统会识别的app自动帮你生成签名,然后把它复制到填写处就OK了~

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=ff3ec4323a2d6a91027ceddd7e65418dda50e0b9&lang=zh_CN

上面的都解决了,我们就开始进入代码部分了~
首先创建一个package,必须命名为wxapi,否则将无法识别

在官网下载一个开发工具包,在libs目录下有一个jar包,复制到自己的项目中,项目右键->open module settings->dependencies->点击+号,选择file dependency把jar包添加进去,这样你就可以使用微信的接口了


接下来是代码部分
可以去官网下载完整的demo示例,把WXEntryActivity拷贝一份到wxapi中,代码如下

public class WXEntryActivity extends Activity implements IWXAPIEventHandler{

    // IWXAPI 是第三方app和微信通信的openapi接口
    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        api = WXAPIFactory.createWXAPI(this,"wxf4881f29e3cf9218",false);
        api.handleIntent(getIntent(),this);
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp resp) {

        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:

                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
            break;
        }
    }

我们先实例化share控件,然后为它实现点击事件,定义一个wecharShare()方法,然后把刚刚下载过来的demo直接拷贝进来,如下:

  WXWebpageObject webpage = new WXWebpageObject();

        WXMediaMessage msg = new WXMediaMessage(webpage);
        msg.title = "WebPage Title";
        msg.description = "WebPage Description";
        msg.mediaObject = new WXImageObject(generateSpringCart());

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = String.valueOf(System.currentTimeMillis());
        req.message = msg;
        req.scene = SendMessageToWX.Req.WXSceneTimeline;
        iwxapi.sendReq(req);
 msg.mediaObject = new WXImageObject(generateSpringCart()); msg.mediaObject顾名思义就是为了获得图像或者视频,我们要把这张贺卡作为图片展示出来,所以这里new出一个WXImageObject,我们自定义generateSpringCart()方法去生成这张贺卡的Bitmap

七、获取系统截图接口:
getWindow().getDecorView();
通过getDecorView获取到decorView,decorView获取到程序显示的区域,包括标题栏,但不包括状态栏。间接可以计算状态栏高度。接着通过cache机制保存为bitmap,调用setDrawingCacheEnabled(...)方法,最会返回用getDrawingCache方法获取ImageView中的图像<br>
P.S buildDrawingCache方法可以不用调用,因为调用getDrawingCache方法时,若果 cache没有建立,系统会自动调用buildDrawingCache方法生成cache。

 private Bitmap generateSpringCart()
    {
        share.setVisibility(View.INVISIBLE);
        View view = getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();

        return  view.getDrawingCache();
    }

八、可视化
因为截图后我们不想看到分享按钮,我们可以先把它在generateSpringCart()方法里面设置隐藏,View.INVISIBLE,然后share点击事件里面再设置share.setVisibility(View.VISIBLE),就可以了~


完整源码和打包后的apk下载地址我已经上传了,地址如下:
http://www.imooc.com/myclub/opus?uid=1303995
github地址:http://github.com/lynhao (代码已上传,欢迎fork~);

2人推荐
随时随地看视频
慕课网APP