热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何给webAPP加上一个apk外壳

webAPP打包成apk流程(原理:手机本地解webapp压缩包后打开index.html)1.首先你需要一个Android开发软件,推荐AndroidStudio。下载地址:

webAPP打包成apk流程(原理:手机本地解webapp压缩包后打开index.html)

1.首先你需要一个Android开发软件,推荐Android Studio。

下载地址:http://www.android-studio.org/

安装过程默认即可,会遇到的问题就一些环境变量,sdk路径选择什么的,这里不详细介绍。


2.创建一个项目

进入软件界面我们开始新建一个项目,项目名自取,项目路径选择,其他的默认即可


3.MyApplication.java(懒,就不解释了,代码直接上。主要就是  1.创建webview  2.创建一个线程把文件复制到一个文件夹里  3.解压缩包  4.webview的url指向本地)

package com.example.cmyh.xxx;

import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.progress.ProgressMonitor;


public class stuGuide extends AppCompatActivity {
    private WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_stu_guide);
        /*WebView main = (WebView)findViewById(R.id.main);*/  webView = (WebView) findViewById(R.id.main);
        new Thread(new Runnable() {
            @Override
            public void run() {
                putfile();
                try {
                    unZipWebZipInThread();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
            webView.goBack();// 返回前一个页面  return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            File path = Environment.getExternalStorageDirectory();
            String mainUrl ="file://" +  path + "/stuGuide/studentGuide/index.html";

            WebSettings webSettings = webView.getSettings();
            webSettings.setJavascriptEnabled(true);
            webView.loadUrl(mainUrl);
        }
    };
    private void putfile() {
        InputStream is = null;
        try {
            is = this.getAssets().open("studentGuide.zip");
            File path = Environment.getExternalStorageDirectory();
            System.out.println("path== " + path);  File file = new File(path + "/stuGuide");
            file.mkdir();  File absoluteFile = file.getAbsoluteFile();
            System.out.println("absoluteFile===" + absoluteFile);
            if (file.exists()) {
                System.out.println("file exists");
            }


            FileOutputStream fos = new FileOutputStream(new File(file.getAbsolutePath()+"/studentGuide.zip"));
            byte[] buffer = new byte[1024];
            int byteCount;
            while ((byteCount = is.read(buffer)) != -1) {
                fos.write(buffer, 0, byteCount);
            }
            fos.flush();
            is.close();
            fos.close();


        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private void unZipWebZipInThread() throws Exception {

        File path = Environment.getExternalStorageDirectory();
        String dstPath = path + "/stuGuide/studentGuide.zip";
        ZipFile zipFile = new ZipFile(dstPath);
        if (zipFile.isValidZipFile()) {
            final ProgressMonitor progressMOnitor= zipFile.getProgressMonitor();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        int percentDone;
                        while (true) {
                            Thread.sleep(50);
                            percentDOne= progressMonitor.getPercentDone();
                            if (percentDone >= 100) {
                                break;
                            }
                        }
                        mHandler.sendEmptyMessage(1);
                    } catch (InterruptedException e) {
                        //JavaLog.e(TAG, e);  }
                }
            }).start();
            zipFile.extractAll(path + "/stuGuide/");
        }
    }

}

4.Activity.xml(随便上个最简单的)

<WebView  android:layout_match_parent"  android:layout_match_parent"  android:id="@+id/main">

WebView>

5.AndroidManifest.xml

网络允许

<uses-permission android:name="android.permission.INTERNET">uses-permission>
sdcard外部存储权限允许

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
webview全屏去头部

android:theme="@style/Theme.AppCompat.Light.NoActionBar" 
手机转屏不重新加载activity

android:cOnfigChanges="keyboardHidden|orientation|screenSize">

6.在main文件夹下新建一个assets文件夹,把webapp打包成zip压缩包,粘贴放入

需要解压缩,所以得导入(版本任意)zip4j_1.3.2.jar

下载地址:http://download.csdn.net/download/cmyh100/9966189

build.gradle 需要配置一下刚刚导入的jar包

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.1.1'   compile files('libs/zip4j_1.3.2.jar')
}

============================================================================  增加兼容性

引入一个 ProgressWebView.java  里面有分装各钟兼容属性
下载地址:http://download.csdn.net/download/cmyh100/9966588
 
 
Activity.xml 里面修改为:
 
 
<com.example.cmyh.stuguide.ProgressWebView  android:layout_match_parent"  android:layout_match_parent"  android:id="@+id/main">

com.example.cmyh.stuguide.ProgressWebView>

MyApplication.java下
 
 
private WebView webView;修改为private  ProgressWebView webView;
webView = (ProgressWebView) findViewById(R.id.main);
webView.setWebViewClient(new WebViewClient(){
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        System.out.println("showMyUrl:"+url);
        view.loadUrl(url);
        return true;
    }
});

 
 



推荐阅读
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文讨论了如何在dotnet桌面(Windows)应用程序中添加图标。作者提到可以使用dotnet命令行工具与resource.rc文件一起使用来为标准.NET核心应用程序添加图标。作者还介绍了在创建控制台应用程序时如何编辑projeto1.csproj文件来添加图标。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 我收到这个错误.我怎么能在我的情况下解决这个问题?Bitmapcannotberesolvedtoatype发生错误的行publicvoidonPageStart ... [详细]
author-avatar
卡瑙娇管
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有