前言

三篇入门文章,这是最后一篇了,在这里我们通过QQ提供的接口来获取用户头像,主要目的为接触并熟悉Android中各种控件定义,了解Activity的生命周期等,学习之前,希望你已经有了一定的JAVA编程能力。

新建工程

这些就不再细讲了,上一篇已经介绍过新建工程的详细步骤。

请输入图片描述

完成上面几步配置之后,就正式进入了编写代码的页面,下面大概介绍一下个文件及按钮的功能

请输入图片描述

看到这里,有没有发现你似乎少了点什么…运行是在哪里进行?上一篇好像忘了说了,不过不碍事,AS编译好的App可以运行在外部的手机中,也可以运行在它自带的模拟器里。

外部手机中运行

电脑拿根usb线连上手机,打开手机的调试模式,点击AS的运行按钮,会弹出可用设备列表,选择你的手机,OK,稍等片刻就能完成安装并运行。

模拟器

上图中标出了AS模拟器按钮,点击它,发现可用设备什么都没有…因为这是要自己创建的(废话有点多)。左下角的Create New Virtual Device,看到了就点吧,我们来新建一个模拟器。

在第一步,需要选择一些分辨率,有没有GPS等东西,随便选吧,反正我们现在都用不到,
建议选择屏幕小的,版本合适的,因为分辨率越大、版本越高,对系统的消耗越大。选好后点Next。

接下来给模拟器选个系统,Android各个系统之间大同小异,对我们的这个程序来说,什么版本都无所谓,但是真正做开发的时候就要照顾到各个版本的兼容性,废话不多说,过程中,同意协议,完成下载,下一步。

最后一步给它起个响亮的名字,就算完成了。点AS的运行按钮,设备列表选择你的模拟器,OK,稍等片刻就能完成安装并运行。

至此,运行设备什么的算是交代完了。

言归正传

来缕一缕我们的任务:输入一个QQ号,输出一个头像。似乎并不难实现,通过URL地址获取图片把它转换成Bitmap再显示出来,目标明确,开干吧。

编写页面

综上所述,我们会需要一个输入框来输入QQ号码,需要一个图片容器来显示图片,加上一个按钮做为点击事件。

而这些控件,需要放置在一个布局当中,在这里我们选用RelativeLayout(相对布局),相对布局是通过相对定位的方式让控件出现在布局任意位置,编写相对较简单和美观。

百闻不如一见,整合上面两段话,直接放代码吧。

<?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"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/t"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="215dp" />

    <ImageView
        android:id="@+id/img"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="27dp"
        android:background="@color/colorPrimary"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="92dp"
        android:text="获取"
        android:id="@+id/bt"
        android:onClick="gettext"/>

</RelativeLayout>

一下子放了好大一串东西,不要慌,我们来看看这都是些什么

1

效果图

1

我们这个程序所有的页面就算是做好了,现在你可以运行看看效果。但这更像是一张图片,没有任何点击效果,点击效果是我们接下来要做的。

编写逻辑

Android的生命周期从MainActivity的Create方法开始,我们在这里获取页面中的控件。
在按钮的点击事件中调用QQ头像获取的接口,并将它显示在图片容器中。

获取页面控件

public class MainActivity extends AppCompatActivity {

    ImageView img;//定义图片容器。
    EditText text;//定义输入栏。
    Button bt;//定义按钮。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);//获取页面

        img = findViewById(R.id.img);//让图片容器指向页面中的图片容器id。
        text = findViewById(R.id.t);//让输入栏指向页面中的输入栏id。
        bt = findViewById(R.id.bt);//让按钮指向页面中的按钮id。

    }
}

上面代码和注释已经写的很直观了,获取控件之后就可以用他们来做些什么。

获取输入栏里的内容

text.getText();

这行代码返回的值是text对象指向id的控件上文字,也就是输入的内容。

按钮的点击事件

android:onClick="gettext"

在页面中我们定义了按钮点击时要调用的函数,每次按钮被点击它都会在主函数中寻找gettext方法,并执行里面的命令。而在主函数MainActivity中,我们需要定义gettext方法:

 public void gettext(View view) {
    //在这里写点击事件。
 }

QQ头像接口

http://q2.qlogo.cn/headimg_dl?bs=QQ号&dst_uin=QQ号&dst_uin=QQ号&;dst_uin=QQ号&spec=100&url_enc=0&referer=bu_interface&term_type=PC

这…就没什么好说的了吧?可以简单做个实验,上面的“QQ号”替换成你自己的QQ号,输入在浏览器地址栏,你会得到QQ号对应头像的图片。

获取图片

想要在图片容器ImageView中显示,需要先通过url地址获取图片,将它转换为Bitmap,把Bitmap输入到ImageView中即可,具体实现如下:

Bitmap getqq (String qq){
    Bitmap bitmap = null;
    URL imgUrl;
    String url = "http://q2.qlogo.cn/headimg_dl?bs="+qq+"&dst_uin="+qq+"&dst_uin="+qq+"&;dst_uin="+qq+"&spec=100&url_enc=0&referer=bu_interface&term_type=PC";
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
    HttpURLConnection conn = null;
    try {
        imgUrl = new URL(url);
        conn = (HttpURLConnection) imgUrl.openConnection();
        conn.setDoInput(true);
        conn.connect();
        InputStream is = conn.getInputStream();
        bitmap = BitmapFactory.decodeStream(is);
        is.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return bitmap;
}

这段代码意思是:输入QQ号,通过接口获取它对应的头像并将它转换为Bitmap再返回。是纯Java代码,这篇文章就不细讲了。

所有小功能都已经完成,接下来整合到一起,输入一个QQ号,输出它的头像:

public void gettext(View view) {

    String string = String.valueOf(text.getText());
    img.setImageBitmap(getqq(string));

}

在点击事件中加了两行代码,我们的程序就做好了,很简单,对吧?
第一行:获取了输入栏里的内容,转换为字符串。
第二行:把字符串,也就是QQ号输入到getqq()方法里,返回的头像Bitmap又输入到ImageView的setImageBitmap()方法中,这个方法会将Bitmap图片显示在img对象id指向的页面中图片容器内。

下面是完整的MainActivity代码:

package com.example.hasayam.getphoto;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

    ImageView img;
    EditText text;
    Button bt;

    @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        img = findViewById(R.id.img);
        text = findViewById(R.id.t);
        bt = findViewById(R.id.bt);

    }

    Bitmap getqq (String qq){
        Bitmap bitmap = null;
        URL imgUrl;
        String url = "http://q2.qlogo.cn/headimg_dl?bs="+qq+"&dst_uin="+qq+"&dst_uin="+qq+"&;dst_uin="+qq+"&spec=100&url_enc=0&referer=bu_interface&term_type=PC";
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
        HttpURLConnection conn = null;
        try {
            imgUrl = new URL(url);
            conn = (HttpURLConnection) imgUrl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }

    public void gettext(View view) {

        String string = String.valueOf(text.getText());
        img.setImageBitmap(getqq(string));

    }
}

联网权限

<uses-permission android:name="android.permission.INTERNET"/>

Android的权限是一种安全机制。主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组件访问。在开发过程中,当我们使用了某些系统特性的功能,且此类特性需要包含相应权限时,如果在AndroidManifest.xml文件中相应申明,则会运行错误且提示:java.lang.SecurityException: Permission Denial …

一般情况下,在AndroidManifest.xml中通过 uses-permission 增加上相应权限即可。

1

关于

下载源码

下载安装包

结语

前三篇Android开发入门的内容到此为止,期待之后和大家一起学习更多编程相关的内容。

分类: 技术

发表评论

电子邮件地址不会被公开。