套壳开发 给webAPP加上一个apk外壳

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_width="match_parent"
    android:layout_height="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_width="match_parent"
    android:layout_height="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;
    }
});
--------------------- 
作者:cmyh 
来源:CSDN 
原文:https://blog.csdn.net/cmyh100/article/details/77862962 
版权声明:本文为博主原创文章,转载请附上博文链接!

上一篇:悄悄摸近SpringBoot之静态资源访问的两种方式(二)


下一篇:最新黑技术:ios免越狱免上架、免企业证书、免审核ios webapp