简易安卓APP

简介

  现在来分享期末做的安卓大作业——生活百科。

  本项目只是单纯的一个大作业,没有考虑实际的需求,所以有设计不合理的地方,请见谅。

  这个项目有三大功能(因为是使用了侧边栏所以是可以继续往里面添加功能的),首先有单词查询,其次是天气查询,后来是机器聊天功能。单词查询是使用了扇贝单词提供的免费API;天气查询是使用了聚合数据提供的天气API,这里需要注册使用(有限的免费使用);机器聊天是使用了图灵机器人的API。所以,总结一下,这里我的主要工作不会很多,主要是调用API然后进行数据的分析和显示工作。

  本次使用的IDE是idea(Android studio)。

  

  文章的最后将会给出源码,但是一些API接口需要自己去申请Key

在项目开始前的学习阶段

安卓基础入门 http://www.runoob.com/android/android-tutorial.html

安卓省市联动(天气的位置选择) http://blog.csdn.net/qq_20521573/article/details/51914180

安卓fragment的使用 http://www.jikexueyuan.com/course/708.html

机器聊天界面的HTML源码 http://www.lanrenzhijia.com/js/3930.html

以上便是我着手项目的累积步骤,希望有帮助

1. 项目准备阶段

1.1. 新建项目

  使用Android Studio(IDEA)新建安卓项目->选择SDK版本(Android 4.0为好)->选择Navigation Drawer Activity模板->完成项目创建。项目新建之后就会得到我们基本的界面模板了。而后,只需要删除右侧边和底部的元素就可得到下图所示的界面

当然,这里使用Android ADT也是可以的,不过好像新建出来的模板不一样,比较丑一点(自己对于Android的UI不太行),所以就使用了Android Studio。

1.2. 添加依赖

  由于需要使用省市联动的功能,所以需要添加外部依赖,在上面给出的链接上有详细说明,因此需要在app文件夹下的build.gradle里面的dependencies加入

  

    compile ‘com.contrarywind:Android-PickerView:3.2.5‘//自定义控件
    compile ‘com.google.code.gson:gson:2.7‘//解析JSON

  做完了准备工作之后就进入主题

2. 单词查询功能

  考虑文章的篇幅过长,所以有些详细的过程可能会省略(像界面的修改工作等等)。

  当我们输入了单词之后点击查询是需要访问网络的,这里采用了异步的任务机制去访问网络并且得出结果,部分代码如下:

  

//这是继承OnQueryTextListener 的内部类,用于处理搜索框监听事件
public class SearchViewClickListener implements SearchView.OnQueryTextListener {

        @Override
        public boolean onQueryTextSubmit(String s) {
            if (!lastSearchResult.equals(s)){//判断上一个结果和目前查询的是否相同
                System.out.println("上个结果:"+lastSearchResult);
                SearchWordTask task = new SearchWordTask();//新建查询任务
                task.execute("https://api.shanbay.com/bdc/search/?word="+s);//访问网络的地址
                searchResult.setVisibility(View.VISIBLE);//设置查询结果的TextView可见
            }
            lastSearchResult = s;//更新最后查询结果
            System.out.println("最新结果:"+s);
            return true;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            return true;
        }
    }

在访问网络而后传回数据我这里将这个功能提取到了一个工具类,代码如下:

public class HttpUtil {

    /**
     * 获取访问网络后传回的数据
     * @param urlString URL
     * @return String
     */
    public static String getJSONResult(String urlString){
        try {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36");

            InputStream is = conn.getInputStream();
            byte[] buff = new byte[1024];
            int hasRead;
            StringBuilder result = new StringBuilder("");
            while ((hasRead = is.read(buff)) > 0) {
                result.append(new String(buff, 0, hasRead));
            }
            return result.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

在上面中SearchWordTask是一个继承了AsyncTask的内部类,主要是实现了访问扇贝提供的英文单词查询API,部分代码如下:

class SearchWordTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... arg0) {
            //arg0是执行AsyncTask的execute函数传入的可变参数
            //这里arg0[0]是"https://api.shanbay.com/bdc/search/?word="+s
            return HttpUtil.getJSONResult(arg0[0]);
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            if (result == null || "".equals(result)){
                Toast.makeText(getActivity(), "查询出错!", Toast.LENGTH_LONG).show();
            }else
                fillResultForJSON(result);

        }

        /**
         * 解析查询的结果
         * @param JSON JSON数据
         */
        private void fillResultForJSON(String JSON){
            try {
                JSONObject object = new JSONObject(JSON);
                if ("SUCCESS".equals(object.getString("msg"))){
                    final JSONObject dataObject = object.getJSONObject("data");
                    paraphrase.setText("基本释义:"+dataObject.getString("definition"));
                    final String uk_audio = dataObject.getString("uk_audio");
                    final String us_audio = dataObject.getString("us_audio");
                    detail.setOnClickListener(new View.OnClickListener() {
                        //如果详细释义按钮点击则访问如下页面
                        @Override
                        public void onClick(View view) {

                            webView.setVisibility(View.VISIBLE);
                            webView.loadUrl("https://www.shanbay.com/bdc/mobile/preview/word?word="+lastSearchResult);
                            webView.setWebViewClient(new WebViewClient());
                        }
                    });
                    //以下是发音按钮被点击时的监听事件
                    UKButton.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            try {
                                //使用UKMediaPlayer 播放声音
                                UKMediaPlayer = new MediaPlayer();
                                UKMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                                UKMediaPlayer.setDataSource(uk_audio);
                                UKMediaPlayer.prepare(); // 这个过程可能需要一段时间,例如网上流的读取
                                UKMediaPlayer.start();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    });

                    USButton.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                           //同上面的播放声音步骤
                           ...
                    });

                    JSONObject pronunciations =dataObject.getJSONObject("pronunciations");
                    UKPronunciation.setText("英式发音:["+pronunciations.getString("uk")+"]");
                    USPronunciation.setText("美式发音:["+pronunciations.getString("us")+"]");
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

以上便是单词查询的主体功能了,当然,考虑文章篇幅所以不能一一解析。

3. 天气查询功能

  在天气查询功能中比较重要的就是使用了网友所写的省市联动功能,这里请参考上面链接中的文章。下面我将不会涉及这方面的讲解,这里主要是说一下访问聚合数据所提供的API,这个功能的效果如下图:

  

  

  在上面功能中的业务代码主要是跟上面的单词查询差不多,都是使用了异步查询,由内部类实现,代码如下:

  

 class WeatherTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... arg0) {

            try {
                return HttpUtil.getJSONResult(arg0[0] + URLEncoder.encode(arg0[1], "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            if (result != null){
                parseWeatherJSON(result);
            }
        }

        /**
         * 根据JSON数据解析
         * @param result JSON
         */
        private void parseWeatherJSON(String result){
            try {
                JSONObject object = new JSONObject(result);
                if (object.getInt("error_code") == 0){
                    JSONObject resultObj = object.getJSONObject("result");
                    JSONObject todayObj = resultObj.getJSONObject("today");
                    String weatherResult = "温度:"+todayObj.getString("temperature")+"\n";
                    weatherResult += "天气状况:"+todayObj.getString("weather")+"\n";
                    weatherResult += "风向:"+todayObj.getString("wind")+"\n";
                    weatherResult += "穿衣建议:"+todayObj.getString("dressing_advice");
                    todayWeather.setText(weatherResult);
                }else {
                    todayWeather.setText("请求出错!");
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

4. 机器聊天功能

  机器聊天功能是使用了HTML页面来进行人机交互,所以,这里基本上没有涉及到Java上面的问题,主要是加载HTML页面以及开启JavaScript功能,代码如下:

WebView webView = (WebView) rootView.findViewById(R.id.chat_robot);
//加载本地的HTML页面(将文件置于src/main/assets/)       webView.loadUrl("file:///android_asset/chat_robot.html");
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());

  功能的实现效果如图:

  

  当然了,要是用以上的聊天功能需要注册图灵机器人申请Key,源码中不会提供Key,所以请自行注册。

  在接收图灵机器人返回的数据时,它会有代码来确定返回的是什么类型,所以,需要我们来判断类型来进行相应的解析(这里的JS代码就不贴出来了)。

5. 总结

  这次的是一个安卓的期末作业,但是却没有很认真的对待的样子,而且项目还是不完善的,比如,在查询了单词后做其他功能的操作再次返回单词查询功能则之前的数据不能够保存,用户体验不好。这里当然我也知道一些解决的方案,保存当前的fragment状态,但是,我还是偷懒了。懒惰真的是宿敌。

  文章上写的详细程度不够,但是主要的代码都已经写出。我知道,有时候解决一个功能并不是功能本身,而是要防止功能附带出来的bug,当然了,这就是我的经历。

  还有就是可能我对于面向对象还是理解上有所偏差,对于抽象还是做得很烂,接下来希望看看别人的源码来改善这个问题。

  

项目源码已上传GitHubCSDN资源,如果资源分很多的朋友就使用CSDN下载吧。下载后需要去注册相应的Key之后填入,否则无法使用,注册地址在简介中已经给出

原文地址:https://www.cnblogs.com/lger/p/8289175.html

时间: 2024-09-28 18:54:28

简易安卓APP的相关文章

如何Python写一个安卓APP

前言:用Python写安卓APP肯定不是最好的选择,但是肯定是一个很偷懒的选择,而且实在不想学习Java,再者,就编程而言已经会的就Python与Golang(注:Python,Golang水平都一般),那么久Google了一下Python写安卓的APP的可能性,还真行. 既然要写个APP,那么总得要有个想法吧. 其实笔者想做两个APP来着,一个是自己写着好玩的,一个是关于运维的. 关于运维的APP,设计应该如下 可能长这样 然后设计应该是这样. 如果觉得可行的话,评论留言一下你觉得应该写进这个

安卓App安全保护,如何防止app反编译!

先进的移动设备具有各种奇妙的功能,从长远来看可以节省大量的时间和金钱.但这些设备真是太新了,所以他们具有"不可预料的弱点和保护不当的价值." 手机方面,恶意软件大约99%的目标是针对Android的,而Java编程语言里的漏洞被人利用的机会最高.文章出处!www.ijiami.cn 基于可理解的原因,尽管中国已是智能手机生产大国和消费大国,但智能手机的"大脑"即操作系统还全靠"外援",目前主要有谷歌的安卓系统和苹果的IOS系统.两者中,开放的安卓

提供就医帮助的安卓APP

首先 这是我们团队第一次开发安卓APP,也是我 个人第一个开发项目APP,俗话说:“万事开头难”.所以对于新手的我们来说,做好开发前的准备至关重要.凡事预则立不预则废! 首先我们团队这次开发的提供就医帮助的安卓APP,是基于安卓平台的APP,其主要 功能提供预约挂号,名医名院推荐,就医导航,我的服务,个人中心等模块.我和谭枝敬同学负责APP功能的实现. 开发AndroidAPP的首个步骤是获得Android SDK.SDK包含核心库.模拟器.工具和代码范例.我们使用的是Eclipse和Andro

安卓App安全检查平台、爱加密App安全加密!

2014年6月初,爱加密高调推出免费自动化App安全检测平台,这是国内首家自动化App安全检测平台,也是爱加密推出的一个重磅产品.作为国内首家免费自动化App安全检测平台,在目前整个互联网行业,包括移动互联网行业还没有这样的服务平台出现,行业前景相当乐观.www.ijiami.cn 只需一键,专业简单,让风险漏洞无处遁形 爱加密漏洞分析平台的推出旨在打造一个服务于移动互联网开发者的安全服务平台,同时也给整个移动互联网安全领域带来一份保障.目前移动应用开发者越来越多,他们不知道自己的应用是否安全,

如何通过Html网页调用本地安卓app

如何使用html网页和本地app进行传递数据呢?经过研究,发现还是有方法的,总结了一下,大致有一下几种方式 一.通过html页面打开Android本地的app 1.首先在编写一个简单的html页面 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</t

安卓APP测试之使用Burp Suite实现HTTPS抓包方法

APP的测试重点小部分在APP本身,大部分还是在网络通信上(单机版除外).所以在安卓APP测试过程中,网络抓包非常重要,一般来说,app开发会采用HTTP协议.Websocket.socket协议,一般来说,HTTP协议最多,Websocket是后起之秀,socket最少,而针对HTTP和websocket,Burp Suite工具是最适合不过的工具了.但是在遇到了app使用SSL或TLS加密传输(https)的时候,由于证书不被信任,直接导致网络通信终端,抓包失败.本文介绍如何使用Burp s

sikuli+eclipse对于安卓app自动化测试的应用(第一次写博客,有些语言还不太专业,望海涵)

Sikuli是什么? 下面是来自于官网的介绍:Sikuli is a visual technology to automate and test graphical user interfaces (GUI) using images (screenshots). Sikuli includes Sikuli Script, a visual scripting API for Jython, and Sikuli IDE, an integrated development environm

安卓App应用加固、App安全保护!

据最新消息,Android 应用数量已成功超越苹果,并将率先突破100万大关.而在众多多的应用之中,却潜伏着太多"不速之客".由于利益驱使以及相关法律的缺失,不法分子将病毒.木马内置于手机App中进行传播,导致手机死机.个人信息泄露.收取短信彩信进行扣费等情况发生,严重影响手机用户的正常使用. 很多用户都认为手机病毒.木马离自己很远,其实则不然,这些携带病毒.木马或恶意广告的App就广泛存在于应用市场之中.据艾媒咨询最新发布的报告显示,在中国手机病毒和恶意软件主要传播途径方面,应用商店

用NAT123搭建内网WCF服务并实现安卓APP访问附带站点简单的性能测试

以下原创,转转请注明出处,谢谢合作! 简介:NAT123是个很很强大的工具,而且使用非常简单,真正实现了帮用户无视内外网的建站服务. 这里简单介绍一下如何用NAT123建内网WCF服务,然后用一个安卓APP实现对它的调用,由于NAT123提供全端口映射(需要访问者支持),所以既可以做站点,APP后台,也可以做其他应用的服务器比如FTP等等,根据具体应用的需要而定.最后对所建的两个映射站点做了个简单的性能测试. 用NAT123搭建内网WCF服务:(由于文章主要是介绍NAT123,WCF相关内容自行