一个简单的安卓阅读app,适用于安卓毕业设计/课程设计
一款简单的看小说软件,适合毕业设计&课程设计学习使用。
功能简介如下:
一.书籍阅读介绍
1. 网络书籍:可以在线阅读网络书籍,无需下载,当然也提供了将书籍下载到本地的功能
2. 本地书籍:可以解析本地书籍并阅读,但要求本地书籍有一定的排版,比如有适当的章节名,有打回车分段等
二.阅读界面功能
1.章节目录:可以查看当前小说的章节目录,网络书籍的章节通过解析网址获取,本地书籍的章节通过解析本地文件获得(仅支持txt,且可能要5s左右)
2.下载到本地:当是网络小说时,可以选择下载到本地
3.章节跳转:可以选择跳转到上一章或下一章,也可以拖动中间的滑动条跳转,这个操作对于本地书籍也支持的较好
4.日夜间模式切换:夜间的实现方式是将阅读背景换成黑底白字
5.亮度调节:自定义亮度及跟随系统亮度
6.字体大小更改
7.字体切换
8.简繁体切换
9.阅读背景切换
10.自动阅读
三.本地书籍查找
1.可以搜索本地书籍
2.可以浏览文件夹
四.网上书城
1.可以浏览网上书城中的几个分区里的内容,每天会更新
2.点击更多书籍后会查找该分类下更多的书籍
五.网络书籍搜索
1.可以搜索两个不同小说来源中的书籍
2.可以搜索推荐列表中的书籍
3.可以留下搜索记录
六.个人中心
1.可以更改当前主页颜色(换主题)
2.可以打开日月模式(调节系统亮度来实现的)
3.下拉个人中心界面,可以看到登录按钮,可以打开登录界面
待实现:
1.阅读界面加入模拟翻页效果
2.apk自动检查更新
等...
主程序代码:
package com.zhlw.azurereader.application;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import androidx.appcompat.app.AppCompatDelegate;
import com.zhlw.azurereader.api.CommonApi;
import com.zhlw.azurereader.bean.UpdateInfo;
import com.zhlw.azurereader.callback.ResultCallback;
import com.zhlw.azurereader.constant.APPCONST;
import com.zhlw.azurereader.constant.URLCONST;
import com.zhlw.azurereader.custom.DialogCreator;
import com.zhlw.azurereader.ui.BaseActivity;
import com.zhlw.azurereader.utils.CacheHelper;
import com.zhlw.azurereader.utils.DownloadMangerUtils;
import com.zhlw.azurereader.utils.HttpUtil;
import com.zhlw.azurereader.utils.OpenFileHelper;
import com.zhlw.azurereader.utils.TextHelper;
import com.zhlw.azurereader.utils.UriFileUtil;
import java.io.File;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class MyApplication extends Application {
private static Handler handler = new Handler();
private static MyApplication application;
private ExecutorService mFixedThreadPool;
@Override
public void onCreate() {
super.onCreate();
application = this;
settingNightMode();//设置夜间模式
HttpUtil.trustAllHosts();//信任所有证书
mFixedThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());//初始化线程池
BaseActivity.setCloseAntiHijacking(true);
}
@SuppressLint("TrulyRandom")
public static void handleSSLHandshake() {
try {
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
} catch (Exception ignored) {
}
}
public static Context getmContext() {
return application;
}
public static Resources getAppResources() {
return application.getResources();
}
public void newThread(Runnable runnable) {
try {
mFixedThreadPool.execute(runnable);
} catch (Exception e) {
e.printStackTrace();
mFixedThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());//初始化线程池
mFixedThreadPool.execute(runnable);
}
}
public void shutdownThreadPool(){
mFixedThreadPool.shutdownNow();
}
/**
* 主线程执行
*
* @param runnable
*/
public static void runOnUiThread(Runnable runnable) {
handler.post(runnable);
}
public static MyApplication getApplication() {
return application;
}
private boolean isFolderExist(String dir) {
File folder = Environment.getExternalStoragePublicDirectory(dir);
return (folder.exists() && folder.isDirectory()) || folder.mkdirs();
}
/**
* 获取app版本号
*
* @return
*/
public static int getVersionCode() {
try {
PackageManager manager = application.getPackageManager();
PackageInfo info = manager.getPackageInfo(application.getPackageName(), 0);
return info.versionCode;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 获取app版本号(String)
*
* @return
*/
public static String getStrVersionName() {
try {
PackageManager manager = application.getPackageManager();
PackageInfo info = manager.getPackageInfo(application.getPackageName(), 0);
return info.versionName;
} catch (Exception e) {
e.printStackTrace();
return "1.0.0";
}
}
/**
* 检查更新
*/
public static void checkVersion(Activity activity) {
UpdateInfo updateInfo = (UpdateInfo) CacheHelper.readObject(APPCONST.FILE_NAME_UPDATE_INFO);
int versionCode = getVersionCode();
if (updateInfo != null) {
if (updateInfo.getNewestVersionCode() > versionCode) {
updateApp(activity, updateInfo.getDownLoadUrl(), versionCode);
}
}
}
/**
* 检查更新
*/
public static void checkVersionByServer(final Activity activity) {
CommonApi.getNewestAppVersion(new ResultCallback() {
@Override
public void onFinish(Object o, int code) {
int versionCode = getVersionCode();
int newestVersion = Integer.valueOf((String)o) ;
if (newestVersion > versionCode) {
updateApp(activity, URLCONST.method_downloadApp, versionCode);
}
}
@Override
public void onError(Exception e) {
}
});
}
/**
* App自动升级
*
* @param activity
* @param versionCode
*/
public static void updateApp(final Activity activity, final String url, final int versionCode) {
DialogCreator.createCommonDialog(activity, "发现新版本", null, "立即更新",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
TextHelper.showText("正在下载更新...");
DownloadMangerUtils.downloadFileOnNotificationByFinishListener(activity, APPCONST.UPDATE_APK_FILE_DIR,
"AzureReader" + versionCode + ".apk", url, "更新下载",
new DownloadMangerUtils.DownloadCompleteListener() {
@Override
public void onFinish(Uri uri) {
((BaseActivity) activity).setDisallowAntiHijacking(true);//暂停防界面劫持
OpenFileHelper.openFile(application, new File(UriFileUtil.getPath(application, uri)));
}
@Override
public void onError(String s) {
}
});
}
});
}
/*
初始化夜间模式
MODE_NIGHT_NO: 亮色(light)主题,不使用夜间模式
MODE_NIGHT_YES:暗色(dark)主题,使用夜间模式
*/
private void settingNightMode(){
//TODO 需要存到sharedpreferences里去才能判断上一次退出时是什么状态
AppCompatDelegate.setDefaultNightMode(APPCONST.isDayMode?AppCompatDelegate.MODE_NIGHT_NO:AppCompatDelegate.MODE_NIGHT_YES);
}
}
完整源码(含apk文件)下载地址:https://download.csdn.net/download/FL1768317420/89330512