大家好,小編為大家解答手機怎么啟用javascript功能的問題。很多人還不知道安卓手機怎么運行js腳本,現(xiàn)在讓我們一起來看看吧!
? ? ? ? 最近在研究c++與JavaScript的交互,有朋友問我安卓怎樣與JavaScript交互,今天找到一個之前寫的小demo,實現(xiàn)的是安卓webview里面的JavaScript和原生安卓進行交互。實現(xiàn)了安卓與JavaScript交互,就可以用html+js+css在webview實現(xiàn)主要界面,Java只負責一些js不好實現(xiàn)的功能比如文件操作,數(shù)據(jù)庫操作,攝像頭操作等硬件操作python for語句用法。
首先要在工程的AndroidManifest.xml文件申請所需權(quán)限,比如攝像頭,gps定位,訪問存儲卡等,代碼大體如下。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jspp.sdxjwkq.js">
<!--完全的網(wǎng)絡權(quán)限-->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 在SDCard中創(chuàng)建與刪除文件權(quán)限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard寫入數(shù)據(jù)權(quán)限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--震動權(quán)限-->
<uses-permission android:name="android.permission.VIBRATE"/>
<!--攝像頭權(quán)限-->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" /> <!-- 使用照相機權(quán)限 -->
<uses-feature android:name="android.hardware.camera.autofocus" /> <!-- 自動聚焦權(quán)限 -->
<!--閃光燈權(quán)限-->
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<!--獲取粗略位置權(quán)限(wifi)-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!--GPS權(quán)限(獲取精確位置)-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--讀取短信權(quán)限-->
<uses-permission android:name="android.permission.READ_SMS"/>
<!--發(fā)短息權(quán)限-->
<uses-permission android:name="android.permission.SEND_SMS"/>
<!--錄制音頻權(quán)限-->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<application
android:name=".BaseApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
然后就是寫一些方法供JavaScript調(diào)用,下面舉幾個例子
package com.jspp.sdxjwkq.js;
import android.app.Service;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.location.Location;
import android.location.LocationManager;
import android.os.Vibrator;
import android.support.v4.content.ContextCompat;
import android.webkit.JavaInterface;
import android.widget.Toast;
import java.util.List;
/**
* 小工具
*/
public class Utils {
private Camera camera;//照相機句柄
/**
* 震動
* @param time 震動時長(毫秒)
* @return
*/
@JavaInterface
public boolean vibrate(int time){
Vibrator vibrator=(Vibrator) BaseApplication.getContext().getSystemService(Service.VIBRATOR_SERVICE);
vibrator.vibrate(new long[]{0,time},-1);
return true;
}
/**
* 打開閃光燈
* @return
*/
@JavaInterface
public boolean openFlashlight(){
try{
camera= Camera.open();
if(camera!=null){
camera.startPreview();
Camera.Parameters parameters=camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
return true;
}
return false;
}catch (Exception e){
return false;
}
}
/**
* 關(guān)閉閃光燈
* @return
*/
@JavaInterface
public boolean closeFlashlight(){
if(camera!=null){
camera.getParameters().setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(camera.getParameters());
camera.stopPreview();
camera.release();
camera=null;
return true;
}else{
return false;
}
}
/**
* 取得設備位置信息
* @return
*/
@JavaInterface
public String getPosition(){
LocationManager locationManager=(LocationManager) BaseApplication.getContext().getSystemService(Context.LOCATION_SERVICE);
//獲取可用的位置提供器
String locationProvider;
List<String> providers=locationManager.getProviders(true);
if(providers.contains(locationManager.GPS_PROVIDER)){
locationProvider=locationManager.GPS_PROVIDER;
}else if(providers.contains(locationManager.NETWORK_PROVIDER)){
locationProvider=locationManager.NETWORK_PROVIDER;
}else{
return "找不到地理位置獲取設備";
}
if (ContextCompat.checkSelfPermission(BaseApplication.getContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(BaseApplication.getContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED){
Location location=locationManager.getLastKnownLocation(locationProvider);
if(location!=null){
return "{longitude:"+location.getLongitude()+",latitude"+location.getLatitude()+"}";
}else{
return "獲取地理位置失敗";
}
}else {
return "沒有權(quán)限獲取該設備地理位置";
}
}
@JavaInterface
public void toast(String msg){
Toast.makeText(BaseApplication.getContext(),msg,Toast.LENGTH_LONG).show();
}
}
package com.jspp.sdxjwkq.js;
import android.webkit.JavaInterface;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.File;
/**
* 文件操作
*/
public class FileSystem {
public String DirRoot="/mnt/sdcard";//文件系統(tǒng)的根
/**
* 創(chuàng)建文件夾
* @param url(文件夾路徑)
* @return
*/
@JavaInterface
public boolean createDirByUrl(String url){
File file=new File(this.DirRoot+url);
if(!file.exists()){
file.mkdirs();
return true;
}else{
return false;
}
}
/**
* 文件是否存在
* @param url
* @return
*/
@JavaInterface
public boolean fileExists(String url){
File file=new File(this.DirRoot+url);
return file.exists();
}
/**
* 返回文件列表
* @param url
* @return
*/
@JavaInterface
public String getFileListByUrl(String url){
try{
JSONArray jsonArray=new JSONArray();
File file=new File(this.DirRoot+url);
File[] subFile=file.listFiles();
for(int i=0;i<subFile.length;i++){
JSONObject jsonObject=new JSONObject();
jsonObject.put("name",subFile[i].getName());//文件名
jsonObject.put("path",subFile[i].getPath());//文件路徑
if(subFile[i].isDirectory()){//文件類型
jsonObject.put("type","dir");
}else{
jsonObject.put("type","file");
}
jsonObject.put("size",subFile[i].length());
jsonArray.put(i,jsonObject);
}
return jsonArray.toString();
}catch (Exception e){return "error";}
}
}
可以看到每一個類前面都要引入android.webkit.JavaInterface這個包,還有就是方法都要是public的,前面標注上@JavaInterface,聲明為JavaScript接口。
最后就是在相應的webview控件里面暴露這些接口啦,例如下面代碼
package com.jspp.sdxjwkq.js;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
/**
* 軟件列表
*/
public class AppFragment extends Fragment {
private static WebView webView;
/**
* 在這里寫頁面邏輯
* @param savedInstanceState
*/
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
webView=getView().findViewById(R.id.webView1);
//新窗口使用webview
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view,String url){
view.loadUrl(url);
return true;
}
});
webView.getSettings().setJavaScriptEnabled(true);//支持java
//java接口映射
webView.addJavaInterface(new Utils(), "Utils");
webView.addJavaInterface(new Sql(), "Sql");
webView.loadUrl("file:///mnt/sdcard/jspp/system/appList.html");
}
/**
* 用戶按下返回鍵
* @param keyCode
* @param event
* @return
*/
public static boolean onKeyDown(int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
webView.goBack();
return false;
}
return true;
}
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
public AppFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment AppFragment.
*/
// TODO: Rename and change types and number of parameters
public static AppFragment newInstance(String param1, String param2) {
AppFragment fragment = new AppFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_app, container, false);
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
//用于頁面間通信
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
// throw new RuntimeException(context.toString()
// + " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
?//java接口映射
? ? ? ? webView.addJavaInterface(new Utils(), "Utils");
? ? ? ? webView.addJavaInterface(new Sql(), "Sql");
? ? ? ? webView.loadUrl("file:///mnt/sdcard/jspp/system/appList.html");
這幾句就是添加了JavaScript接口映射,直接把實例化對象映射出去,
然后就是在js文件里使用了,比如想要手機振動一秒就可以在js里面直接寫Utils.vibrate(1000);
針對js傳參比較靈活的情況,java實現(xiàn)的時候可以對方法進行重載。
下面就是之前測試的效果
界面是用的原生的FragmentPager控件,中間白色部分是webview載入的本地網(wǎng)頁。
可以看到在AndroidManifest.xml文件申請的那些權(quán)限,
文章來源:http://www.zghlxwxcb.cn/news/detail-818939.html
因為應用本身沒有多少圖片等資源,所以打包之后也非常小巧。?文章來源地址http://www.zghlxwxcb.cn/news/detail-818939.html
? ? ? ? 最近在研究c++與JavaScript的交互,有朋友問我安卓怎樣與JavaScript交互,今天找到一個之前寫的小demo,實現(xiàn)的是安卓webview里面的JavaScript和原生安卓進行交互。實現(xiàn)了安卓與JavaScript交互,就可以用html+js+css在webview實現(xiàn)主要界面,Java只負責一些js不好實現(xiàn)的功能比如文件操作,數(shù)據(jù)庫操作,攝像頭操作等硬件操作python for語句用法。
首先要在工程的AndroidManifest.xml文件申請所需權(quán)限,比如攝像頭,gps定位,訪問存儲卡等,代碼大體如下。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jspp.sdxjwkq.js">
<!--完全的網(wǎng)絡權(quán)限-->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 在SDCard中創(chuàng)建與刪除文件權(quán)限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard寫入數(shù)據(jù)權(quán)限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--震動權(quán)限-->
<uses-permission android:name="android.permission.VIBRATE"/>
<!--攝像頭權(quán)限-->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" /> <!-- 使用照相機權(quán)限 -->
<uses-feature android:name="android.hardware.camera.autofocus" /> <!-- 自動聚焦權(quán)限 -->
<!--閃光燈權(quán)限-->
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<!--獲取粗略位置權(quán)限(wifi)-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!--GPS權(quán)限(獲取精確位置)-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--讀取短信權(quán)限-->
<uses-permission android:name="android.permission.READ_SMS"/>
<!--發(fā)短息權(quán)限-->
<uses-permission android:name="android.permission.SEND_SMS"/>
<!--錄制音頻權(quán)限-->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<application
android:name=".BaseApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
然后就是寫一些方法供JavaScript調(diào)用,下面舉幾個例子
package com.jspp.sdxjwkq.js;
import android.app.Service;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.location.Location;
import android.location.LocationManager;
import android.os.Vibrator;
import android.support.v4.content.ContextCompat;
import android.webkit.JavaInterface;
import android.widget.Toast;
import java.util.List;
/**
* 小工具
*/
public class Utils {
private Camera camera;//照相機句柄
/**
* 震動
* @param time 震動時長(毫秒)
* @return
*/
@JavaInterface
public boolean vibrate(int time){
Vibrator vibrator=(Vibrator) BaseApplication.getContext().getSystemService(Service.VIBRATOR_SERVICE);
vibrator.vibrate(new long[]{0,time},-1);
return true;
}
/**
* 打開閃光燈
* @return
*/
@JavaInterface
public boolean openFlashlight(){
try{
camera= Camera.open();
if(camera!=null){
camera.startPreview();
Camera.Parameters parameters=camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
return true;
}
return false;
}catch (Exception e){
return false;
}
}
/**
* 關(guān)閉閃光燈
* @return
*/
@JavaInterface
public boolean closeFlashlight(){
if(camera!=null){
camera.getParameters().setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(camera.getParameters());
camera.stopPreview();
camera.release();
camera=null;
return true;
}else{
return false;
}
}
/**
* 取得設備位置信息
* @return
*/
@JavaInterface
public String getPosition(){
LocationManager locationManager=(LocationManager) BaseApplication.getContext().getSystemService(Context.LOCATION_SERVICE);
//獲取可用的位置提供器
String locationProvider;
List<String> providers=locationManager.getProviders(true);
if(providers.contains(locationManager.GPS_PROVIDER)){
locationProvider=locationManager.GPS_PROVIDER;
}else if(providers.contains(locationManager.NETWORK_PROVIDER)){
locationProvider=locationManager.NETWORK_PROVIDER;
}else{
return "找不到地理位置獲取設備";
}
if (ContextCompat.checkSelfPermission(BaseApplication.getContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(BaseApplication.getContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED){
Location location=locationManager.getLastKnownLocation(locationProvider);
if(location!=null){
return "{longitude:"+location.getLongitude()+",latitude"+location.getLatitude()+"}";
}else{
return "獲取地理位置失敗";
}
}else {
return "沒有權(quán)限獲取該設備地理位置";
}
}
@JavaInterface
public void toast(String msg){
Toast.makeText(BaseApplication.getContext(),msg,Toast.LENGTH_LONG).show();
}
}
package com.jspp.sdxjwkq.js;
import android.webkit.JavaInterface;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.File;
/**
* 文件操作
*/
public class FileSystem {
public String DirRoot="/mnt/sdcard";//文件系統(tǒng)的根
/**
* 創(chuàng)建文件夾
* @param url(文件夾路徑)
* @return
*/
@JavaInterface
public boolean createDirByUrl(String url){
File file=new File(this.DirRoot+url);
if(!file.exists()){
file.mkdirs();
return true;
}else{
return false;
}
}
/**
* 文件是否存在
* @param url
* @return
*/
@JavaInterface
public boolean fileExists(String url){
File file=new File(this.DirRoot+url);
return file.exists();
}
/**
* 返回文件列表
* @param url
* @return
*/
@JavaInterface
public String getFileListByUrl(String url){
try{
JSONArray jsonArray=new JSONArray();
File file=new File(this.DirRoot+url);
File[] subFile=file.listFiles();
for(int i=0;i<subFile.length;i++){
JSONObject jsonObject=new JSONObject();
jsonObject.put("name",subFile[i].getName());//文件名
jsonObject.put("path",subFile[i].getPath());//文件路徑
if(subFile[i].isDirectory()){//文件類型
jsonObject.put("type","dir");
}else{
jsonObject.put("type","file");
}
jsonObject.put("size",subFile[i].length());
jsonArray.put(i,jsonObject);
}
return jsonArray.toString();
}catch (Exception e){return "error";}
}
}
可以看到每一個類前面都要引入android.webkit.JavaInterface這個包,還有就是方法都要是public的,前面標注上@JavaInterface,聲明為JavaScript接口。
最后就是在相應的webview控件里面暴露這些接口啦,例如下面代碼
package com.jspp.sdxjwkq.js;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
/**
* 軟件列表
*/
public class AppFragment extends Fragment {
private static WebView webView;
/**
* 在這里寫頁面邏輯
* @param savedInstanceState
*/
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
webView=getView().findViewById(R.id.webView1);
//新窗口使用webview
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view,String url){
view.loadUrl(url);
return true;
}
});
webView.getSettings().setJavaScriptEnabled(true);//支持java
//java接口映射
webView.addJavaInterface(new Utils(), "Utils");
webView.addJavaInterface(new Sql(), "Sql");
webView.loadUrl("file:///mnt/sdcard/jspp/system/appList.html");
}
/**
* 用戶按下返回鍵
* @param keyCode
* @param event
* @return
*/
public static boolean onKeyDown(int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
webView.goBack();
return false;
}
return true;
}
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
public AppFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment AppFragment.
*/
// TODO: Rename and change types and number of parameters
public static AppFragment newInstance(String param1, String param2) {
AppFragment fragment = new AppFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_app, container, false);
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
//用于頁面間通信
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
// throw new RuntimeException(context.toString()
// + " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
?//java接口映射
? ? ? ? webView.addJavaInterface(new Utils(), "Utils");
? ? ? ? webView.addJavaInterface(new Sql(), "Sql");
? ? ? ? webView.loadUrl("file:///mnt/sdcard/jspp/system/appList.html");
這幾句就是添加了JavaScript接口映射,直接把實例化對象映射出去,
然后就是在js文件里使用了,比如想要手機振動一秒就可以在js里面直接寫Utils.vibrate(1000);
針對js傳參比較靈活的情況,java實現(xiàn)的時候可以對方法進行重載。
下面就是之前測試的效果
界面是用的原生的FragmentPager控件,中間白色部分是webview載入的本地網(wǎng)頁。
可以看到在AndroidManifest.xml文件申請的那些權(quán)限,
因為應用本身沒有多少圖片等資源,所以打包之后也非常小巧。?
到了這里,關(guān)于安卓手機怎么運行js腳本,手機的javascript怎么開的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!