打包前的準備
- 1、android-sdk-windows Android環境
- 2、Eclipse 集成了ADT相關配置
創建android專案
使用eclipse創建Android專案,其他博客上有相關概述,
創建html保存檔案
在assets/apps中,創建一個新的檔案夾名稱(可以隨意定義),此處名稱為chancelock,

在assets/apps/chance路徑下創建一個新的檔案夾www,注意此名稱不能改變,

在assets/apps/chancelock/www下保存mui-html檔案資訊,
修改manifest.json中的相關配置資訊

打開manifest.json檔案,修改其中的id、name屬性,需要和定義的檔案名chancelock保持一致,如下所示:

打開AndroidManifest.xml組態檔,修改其中的android:versionCode和android:versionName屬性,需要和manifest.json中對應,如下所示:

修改data/dcloud_control.xml組態檔資訊
修改data/dcloud_control.xml組態檔資訊,需要保證其中的部分引數資訊和前面配置的相一致,如下圖所示:

啟動類的修改
復制啟動類,修改起全路徑名稱,如下所示

修改其中的路徑配置,方便APP啟動時,自動定位指定的MUI-APP專案檔案,

這個啟動類的具體檔案如下所示:
package com.linkpower.chancelock;
import io.dcloud.EntryProxy;
import io.dcloud.RInformation;
import io.dcloud.common.DHInterface.IApp;
import io.dcloud.common.DHInterface.IApp.IAppStatusListener;
import io.dcloud.common.DHInterface.ICore;
import io.dcloud.common.DHInterface.ICore.ICoreStatusListener;
import io.dcloud.common.DHInterface.IOnCreateSplashView;
import io.dcloud.common.DHInterface.ISysEventListener.SysEventType;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.IWebviewStateListener;
import io.dcloud.feature.internal.sdk.SDK;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AppOpsManager;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Process;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.FrameLayout;
/**
* 本demo為以WebApp方式集成5+ sdk,
*
*/
@SuppressLint("NewApi")
public class SDK_WebApp extends Activity {
boolean doHardAcc = true;
EntryProxy mEntryProxy = null;
private static final int REQUEST_CODE_ACCESS_COARSE_LOCATION = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
if (mEntryProxy == null) {
FrameLayout f = new FrameLayout(this);
// 創建5+內核運行事件監聽
WebappModeListener wm = new WebappModeListener(this, f);
// 初始化5+內核
mEntryProxy = EntryProxy.init(this, wm);
// 啟動5+內核
mEntryProxy.onCreate(this, savedInstanceState, SDK.IntegratedMode.WEBAPP, null);
setContentView(f);
}
getLocationPermission();
}
/**
* 位置權限申請
*/
public void getLocationPermission() {
// M為API23 android6.0
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
Log.i("getLocationPermission-->", "android版本低于6.0,藍牙鎖操作不需要申請位置權限");
return;
}
// android版本大于或等于6.0
Log.i("getLocationPermission()-->", "android版本大于或等于6.0");
/*
* if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) !=
* PackageManager.PERMISSION_GRANTED) {
*/
int value = checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION);
Log.i("getLocationPermission()-->", String.valueOf(value));
// 判斷是否具有權限
if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_DENIED) {
Log.i("getLocationPermission()-->", "不具有位置權限,開始申請位置權限");
// 請求權限
requestPermissions(new String[] { Manifest.permission.ACCESS_COARSE_LOCATION },
REQUEST_CODE_ACCESS_COARSE_LOCATION);
/* } */
} else if (checkSelfPermission(
Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
Log.i("getLocationPermission()-->", "授權位置權限");
return;
}
}
// TODO 權限申請后的回呼
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
// 測驗log
Log.i("權限申請回呼requestCode-->", String.valueOf(requestCode));
Log.i("grantResults陣列長度-->", String.valueOf(grantResults.length));
Log.i("grantResults數值-->", String.valueOf(grantResults[0]));
if (requestCode == REQUEST_CODE_ACCESS_COARSE_LOCATION) {
// PackageManager.PERMISSION_GRANTED 為 0
// 用戶允許改權限,0表示允許,-1表示拒絕 PERMISSION_GRANTED = 0, PERMISSION_DENIED = -1
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.i("onRequestPermissionsResult-->", "位置權限請求成功");
// 小米checkOp回傳值為4
// 華為手機checkOp回傳值為0
int checkOp = 100;
AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_FINE_LOCATION, Process.myUid(), getPackageName());
Log.i("checkOp---->", String.valueOf(checkOp));
if (checkOp != AppOpsManager.MODE_ALLOWED) {
// 0表示允許,不為0表示不允許權限
new AlertDialog.Builder(this).setTitle("提示:")
.setMessage("Android6.0掃描BLE設備需要開啟位置權限,請在手機設定中開啟權限后重新點擊開(關)鎖按鈕")
.setPositiveButton("去設定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// 跳轉到系統權限設定界面
Uri packageURI = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
packageURI);
startActivity(intent);
}
})/* .setNegativeButton("取消", null) */.show();
return;
} else if (checkOp == AppOpsManager.MODE_ALLOWED) {
// 12.25用戶允許開啟位置權限后 才進行后面的藍牙開啟掃描等操作
// checkBLEState();
}
} else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_DENIED) {
Log.i("onRequestPermissionsResult-->", "位置權限請求拒絕");
// 這里進行權限被拒絕的處理
// 12.25
new AlertDialog.Builder(this).setTitle("提示:")
.setMessage("Android6.0掃描BLE設備需要開啟位置權限,請在手機設定中開啟權限后重新點擊開(關)鎖按鈕")
.setPositiveButton("去設定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// 跳轉到系統權限設定界面
Uri packageURI = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
startActivity(intent);
}
})/* .setNegativeButton("取消", null) */.show();
// quit();
}
return;
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return mEntryProxy.onActivityExecute(this, SysEventType.onCreateOptionMenu, menu);
}
@Override
public void onPause() {
super.onPause();
mEntryProxy.onPause(this);
}
@Override
public void onResume() {
super.onResume();
mEntryProxy.onResume(this);
}
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent.getFlags() != 0x10600000) {// 非點擊icon呼叫activity時才呼叫newintent事件
mEntryProxy.onNewIntent(this, intent);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mEntryProxy.onStop(this);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean _ret = mEntryProxy.onActivityExecute(this, SysEventType.onKeyDown, new Object[] { keyCode, event });
return _ret ? _ret : super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
boolean _ret = mEntryProxy.onActivityExecute(this, SysEventType.onKeyUp, new Object[] { keyCode, event });
return _ret ? _ret : super.onKeyUp(keyCode, event);
}
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
boolean _ret = mEntryProxy.onActivityExecute(this, SysEventType.onKeyLongPress,
new Object[] { keyCode, event });
return _ret ? _ret : super.onKeyLongPress(keyCode, event);
}
public void onConfigurationChanged(Configuration newConfig) {
try {
int temp = this.getResources().getConfiguration().orientation;
if (mEntryProxy != null) {
mEntryProxy.onConfigurationChanged(this, temp);
}
super.onConfigurationChanged(newConfig);
} catch (Exception e) {
e.printStackTrace();
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mEntryProxy.onActivityExecute(this, SysEventType.onActivityResult,
new Object[] { requestCode, resultCode, data });
}
}
class WebappModeListener implements ICoreStatusListener, IOnCreateSplashView {
Activity activity;
View splashView = null;
ViewGroup rootView;
IApp app = null;
// ProgressDialog pd = null;
public WebappModeListener(Activity activity, ViewGroup rootView) {
this.activity = activity;
this.rootView = rootView;
}
/**
* 5+內核初始化完成時觸發
*/
@Override
public void onCoreInitEnd(ICore coreHandler) {
// 表示Webapp的路徑在 file:///android_asset/apps/HelloH5
String appBasePath = "/apps/chancelock";
// 設定啟動引數,可在頁面中通過plus.runtime.arguments;方法獲取到傳入的引數
String args = "{url:''}";
// 啟動啟動獨立應用的5+ Webapp
app = SDK.startWebApp(activity, appBasePath, args, new IWebviewStateListener() {
// 設定Webview事件監聽,可在監監聽內獲取WebIvew加載內容的進度
@Override
public Object onCallBack(int pType, Object pArgs) {
switch (pType) {
case IWebviewStateListener.ON_WEBVIEW_READY:
// WebApp準備加載事件
// 準備完畢之后添加webview到顯示父View中,
// 設定排版不顯示狀態,避免顯示webview時html內容排版錯亂問題
View view = ((IWebview) pArgs).obtainApp().obtainWebAppRootView().obtainMainView();
view.setVisibility(View.INVISIBLE);
if (view.getParent() != null) {
((ViewGroup) view.getParent()).removeView(view);
}
rootView.addView(view, 0);
break;
case IWebviewStateListener.ON_PAGE_STARTED:
// 首頁面開始加載事件
// pd = ProgressDialog.show(activity, "加載中", "0/100");
break;
case IWebviewStateListener.ON_PROGRESS_CHANGED:
// WebApp首頁面加載進度變化事件
// if (pd != null) {
// pd.setMessage(pArgs + "/100");
// }
break;
case IWebviewStateListener.ON_PAGE_FINISHED:
// WebApp首頁面加載完成事件
/*
* if (pd != null) { pd.dismiss(); pd = null; }
*/
// 頁面加載完畢,設定顯示webview
// 如果不需要顯示spalsh頁面將此行代碼移動至onCloseSplash事件內
app.obtainWebAppRootView().obtainMainView().setVisibility(View.VISIBLE);
break;
}
return null;
}
}, this);
app.setIAppStatusListener(new IAppStatusListener() {
// 設定APP運行事件監聽
@Override
public boolean onStop() {
// 應用運行停止時呼叫
rootView.removeView(app.obtainWebAppRootView().obtainMainView());
// TODO Auto-generated method stub
return false;
}
@Override
public void onStart() {
// 獨立應用啟動時觸發事件
}
@Override
public void onPause(IApp arg0, IApp arg1) {
// WebApp暫停運行時觸發事件
}
@Override
public String onStoped(boolean arg0, String arg1) {
// TODO Auto-generated method stub
return null;
}
});
}
@Override
public void onCoreReady(ICore coreHandler) {
// 初始化5+ SDK,
// 5+SDK的其他介面需要在SDK初始化后才能調用
SDK.initSDK(coreHandler);
// 設定當前應用可使用的5+ API
SDK.requestAllFeature();
}
@Override
public boolean onCoreStop() {
// 當回傳false時候回關閉activity
return false;
}
// 在Widget集成時如果不需要顯示splash頁面可按照如下步驟操作
// 1 洗掉onCreateSplash方法內的代碼
// 2 將5+mainView添加到rootview時將頁面設定為不可見
// 3 在onCloseSplash方法中將5+mainView設定為可見
// 4 修改androidmanifest.xml檔案 將SDK_WebApp的主題設定為透明
// 注意!
// 如果不顯示splash頁面會造成用戶點擊后頁面短時間內會沒有變化,
// 可能會給用戶造成程式沒回應的錯覺,
// 所以開發者需要對5+內核啟動到5+應用頁面顯示之間的這段事件進行處理
@Override
public Object onCreateSplash(Context pContextWrapper) {
splashView = new FrameLayout(activity);
splashView.setBackgroundResource(RInformation.DRAWABLE_SPLASH);
rootView.addView(splashView);
return null;
}
@Override
public void onCloseSplash() {
rootView.removeView(splashView);
}
}
修改APP應用名稱
修改應用名稱,只需要修改對應的xml組態檔即可,
res/values/strings.xml中,增加相對應的APP名稱即可,

圖示、啟動圖等修改

注意:
splash.png 名稱不可更改!
博客參考資料
- demo 官方案例下載參考
app混合開發離線打包檔案 - 資料參考
MUI開發移動端本地離線打包
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/229979.html
標籤:其他
