2018-12-15 15:08:49 mfkarj 阅读数 42
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    17842 人正在学习 去看看 高煥堂
  1.  Html中调用Android方法
//java 
webView.addJavascriptInterface(new JsInterface(), "obj");

public class JsInterface {
    //JS中调用Android中的方法 和返回值处理的一种方法
        
    /****
          * Html中的点击事件 onclick
      *  <input type="button" value="结算" onclick="showToast('12')">
      * @param toast
      */
    @JavascriptInterface
    public void showToast(String toast) {
      Toast.makeText(MainActivity.this, "你的商品价格是:¥"+toast, Toast.LENGTH_SHORT).show();
    }
}


//js
function showToast(toast) { 
    var money=toast*3;
    javascript:obj.showToast(money);
}

 

 

     2.Android调用JS方法无参数

//java
webView.loadUrl("javascript:funFromjs()");

//js
function funFromjs(){
    document.getElementById("helloweb").innerHTML="div显示数据,无参数";
}

 

 

      3.Android调用JS方法有参数

//java 
webView.loadUrl("javascript:funJs('Android端传入的信息,div标签中显示,含参数')");


//js

function funJs(msg){
   document.getElementById("hello2").innerHTML=msg;
}

 

      4.Android调用JS方法有参数且有返回值处理方式1

//java
webView.loadUrl("javascript:sum(6,6)");


/***
 * Android代码调用获取J是中的返回值
 * 
 * @param result
*/
   @JavascriptInterface
   public void onSum(int result) { 
    Toast.makeText(MainActivity.this, "Android调用JS方法且有返回值+计算结果=="+result, Toast.LENGTH_SHORT).show();
   } 


//js
function sum(i,m){ 
    var result = i*m; 
    document.getElementById("h").innerHTML= "Android调用JS方法且有返回值--计算结果="+result; 
    javascript:obj.onSum(result) 
} 

 

     5.Android调用JS方法有参数且有返回值处理方式2(Android4.4以上)

 

 

//java
webView.evaluateJavascript("sumn(6,11)", new ValueCallback<String>() {
         @Override
     public void onReceiveValue(String value) {
         Toast.makeText(MainActivity.this, "返回值"+value, Toast.LENGTH_SHORT).show();
           }
});



//js
function sumn(i,m){ 
     var result = i*m; 
     document.getElementById("hh").innerHTML= "Android调用JS方法且有返回值--计算结果="+result; 
     return result;
} 

 

 

注意:

1、Java 调用 js 里面的函数、效率并不是很高、估计要200ms左右吧、做交互性很强的事情、这种速度很难让人接受、而js去调Java的方法、速度很快、50ms左右、所以尽量用js调用Java方法

2、Java 调用 js 的函数、没有返回值、调用了就控制不到了

3、Js 调用 Java 的方法、返回值如果是字符串、你会发现这个字符串是 native 的、转成 locale 的才能正常使用、使用 toLocaleString() 函数就可以了、不过这个函数的速度并不快、转化的字符串如果很多、将会很耗费时间

4、网页中尽量不要使用jQuery、执行起来需要5-6秒、最好使用原生的js写业务脚本、以提升加载速度、改善用户体验。

 

注:使用的是本地的Html文件,不过在网络链接的Html文件也是可以实现的。   

2019-02-14 16:41:36 qq_31573123 阅读数 59
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    17842 人正在学习 去看看 高煥堂

Android与js的简单相互调用 

一、js调用Android(点击H5页面的“js调用java”按钮)

方法:通过@JavascriptInterface注解调用

步骤1:将需要调用的js代码以.html的格式放入assets文件夹下

<html>
<script type="text/javascript">
    function callNative() {
        window.bridge.helloNative("js调用Java成功!");
    }
</script>
<button onclick="javascript:callNative();">js调用java</button>
</html>

步骤2:在Android中载入js代码

@SuppressLint({"SetJavaScriptEnabled","JavascriptInterface","addJavascriptInterface"})
    private void showSimpleWebView() {
        WebSettings webSettings = mSimpleWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);  // 设置与js交互的权限
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);  // 设置允许JS弹窗

        //JsInterface为管理native与js交互的类,bridge为js调用native时的别名
        mSimpleWebView.addJavascriptInterface(new JsInterface(), "bridge");
        mSimpleWebView.loadUrl("file:///android_asset/test1.html");  // 载入js代码
    }

步骤3:通过@JavascriptInterface注解调用java方法

 /**
     * js调用java
     */
    public class JsInterface {
        @JavascriptInterface  // 必须使用此注解
        public void helloNative(String str) { // 定义js需要调用的方法
            Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show();
        }
    }

注意事项:

JsInterface为管理native与js交互的类,bridge为js调用native时的别名,helloNative是需要调用的方法名,与js中的window.bridge.helloNative对应。

二、Android调用js(点击Android原生页面的“java调用js”按钮)

方法一:通过loadUrl()方法调用

方法二:通过evaluateJavascript()方法实现

1、loadUrl()获取返回值麻烦,每次调用都会将页面刷新;

2、evaluateJavascript()可以直接获取返回值,但只能在4.4以上使用,调用不会刷新页面。

步骤1:js部分代码,实现callJs方法,弹出提示框

function callJs(parameter) {
        alert(parameter + "java调用js成功!");
    }

 步骤2:Android调用js中的callJs带参方法 

/**
     * java调用js
     */
    public void callJs() {
        mCallJsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String result = "传递的参数,";
                final String parameter = "'传递的参数,'";

                mSimpleWebView.post(new Runnable() {  // 必须在UI线程执行
                    @Override
                    public void run() {
                        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                            mSimpleWebView.loadUrl("javascript:callJs(" + parameter + ")");  // 4.4以下版本使用loadUrl
                        } else {
                            // 4.4及以上版本使用evaluateJavascript
                            mSimpleWebView.evaluateJavascript(String.format(getString(R.string.java_call_js), result),  // 两种string写法均可
                                    new ValueCallback<String>() {
                                @Override
                                public void onReceiveValue(String value) {
                                    // js返回的结果
                                }
                            });
                        }
                    }
                });
            }
        });
    }

注意事项:

1、R.string.java_call_js的内容为 <string name="java_call_js">javascript:callJs(\"%1$s\");</string>;

2、loadUrl()与evaluateJavascript()中的两个字符串中的写法均可;

3、两个方法都必须在UI线程执行。

步骤3:响应js的Alert事件,绘制dialog

mSimpleWebView.setWebChromeClient(new WebChromeClient() {
            // 响应js的Alert函数
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                AlertDialog.Builder dialog = new AlertDialog.Builder(SimpleWebViewActivity.this);
                dialog.setTitle("Alert");
                dialog.setMessage(message);
                dialog.create().show();
                result.cancel();  // 一定要调用cancel()或confirm(),不然onJsAlert只会调用一次
                return true;
            }
        });

有时会出现响应弹出dialog后页面点击无反应,就是因为没有调用result.cancel()或者result.confirm()方法。

步骤4:响应js的下载事件,可打开系统内置浏览器下载apk

 mSimpleWebView.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.addCategory(Intent.CATEGORY_BROWSABLE);
                intent.setData(Uri.parse(url));
                startActivity(intent);
            }
        });

H5部分:

<a href="http://download.xxx.com/xxx.apk">下载图片</a>

 

三、完整代码 

1、H5部分:

<html>
<script type="text/javascript">
    function callNative() {
        window.bridge.helloNative("js调用Java成功!");
    }

    function callJs(parameter) {
        alert(parameter + "java调用js成功!");
    }
</script>
<a href="http://download.xxx.com/xxx.apk">下载图片</a>
<button onclick="javascript:callNative();">js调用java</button>
</html>

2、Android部分:

public class SimpleWebViewActivity extends AppCompatActivity {

    private WebView mSimpleWebView = null;
    private Button mCallJsButton = null;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple_webview);

        mSimpleWebView = (WebView) findViewById(R.id.simple_webview);
        mCallJsButton = (Button) findViewById(R.id.button_java_call_js);
        showSimpleWebView();
    }

    @SuppressLint({"SetJavaScriptEnabled","JavascriptInterface","addJavascriptInterface"})
    private void showSimpleWebView() {
        WebSettings webSettings = mSimpleWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);  // 设置与js交互的权限
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);  // 设置允许JS弹窗

        //JsInterface为管理native与js交互的类,bridge为js调用native时的别名
        mSimpleWebView.addJavascriptInterface(new JsInterface(), "bridge");
        mSimpleWebView.loadUrl("file:///android_asset/test1.html");  // 载入js代码

        callJs();

        mSimpleWebView.setWebChromeClient(new WebChromeClient() {
            // 响应js的Alert函数
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                AlertDialog.Builder dialog = new AlertDialog.Builder(SimpleWebViewActivity.this);
                dialog.setTitle("Alert");
                dialog.setMessage(message);
                dialog.create().show();
                result.cancel();  // 一定要调用cancel()或confirm(),不然onJsAlert只会调用一次
                return true;
            }
        });
        mSimpleWebView.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.addCategory(Intent.CATEGORY_BROWSABLE);
                intent.setData(Uri.parse(url));
                startActivity(intent);
            }
        });
    }

    /**
     * js调用java
     */
    public class JsInterface {
        @JavascriptInterface  // 必须使用此注解
        public void helloNative(String str) { // 定义js需要调用的方法
            Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show();
        }
    }

    /**
     * java调用js
     */
    public void callJs() {
        mCallJsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String result = "传递的参数,";
                final String parameter = "'传递的参数,'";

                mSimpleWebView.post(new Runnable() {  // 必须在UI线程执行
                    @Override
                    public void run() {
                        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                            mSimpleWebView.loadUrl("javascript:callJs(" + parameter + ")");  // 4.4以下版本使用loadUrl
                        } else {
                            // 4.4及以上版本使用evaluateJavascript
                            mSimpleWebView.evaluateJavascript(String.format(getString(R.string.java_call_js), result),  // 两种string写法均可
                                    new ValueCallback<String>() {
                                @Override
                                public void onReceiveValue(String value) {
                                    // js返回的结果
                                }
                            });
                        }
                    }
                });
            }
        });
    }
}

完整代码下载地址:https://download.csdn.net/download/qq_31573123/10957505

2016-10-26 17:58:18 qq_33237207 阅读数 1974
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    17842 人正在学习 去看看 高煥堂

只要大家在开发Android的过程中,使用到webview调用html,其中有点击事件时,一般都会发现点击时会有淡蓝色的点击效果。那这又怎么解决呢?

很简单,一步就解决:

找到点击元素(div或是a标签)用到的css样式,在里面添加一下一句话就ok:

*{ -webkit-tap-highlight-color:rgba(0,0,0,0); } 


注意:“-webkit-tap-highlight-color:”后面不要有空格哦!

2019-09-16 15:48:28 qq_33306364 阅读数 15
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    17842 人正在学习 去看看 高煥堂

首先我这边有了一个需求,就是html页面有一个按钮点击之后需要我选择图片,然后去返回给html。当时我就想直接js调用,然后返回就好啦,可是人家需求是所有页面的调用Android 选择图片的都需要加,不仅仅是我们这页面,那么问题来了,我之前没有弄过这个,网上找了找,大致就是不好找,而且也不太统一,我自己整理下,亲测可用的,不为别的,就是我后续查看比较清楚把。

 

首先:WebView的setWebChromeClient的监听中复写onShowFileChooser,如图:

  WebChromeClient webChromeClient = new WebChromeClient() {

        @Override
        public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
            mFilePathCallback = filePathCallback;
            selectImage();
            return true;
        }
    };
一定要将这个ValueCallback<Uri[]> 的对象保存下来,因为后面会用到。

集成图片选择器:

    compile 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.3'
然后配置选择图片的一些参数并启动图片选择器:
   public static final int IMAGE_REQUESTION_CODE = 456;
    public void selectImage(Activity activity,int num){
        if(num > 1) {
            PictureSelector.create(activity)
                    .openGallery(PictureMimeType.ofImage())
                    .theme(R.style.picture_default_style)
                    .maxSelectNum(num)
                    .minSelectNum(1)
                    .imageSpanCount(3)// 每行显示个数
                    .selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选
                    .previewImage(true)// 是否可预览图片
                    .isCamera(true)// 是否显示拍照按钮
                    .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
//                        .enableCrop(true)// 是否裁剪
//                        .compress(true)// 是否压缩
                    .synOrAsy(true)//同步true或异步false 压缩 默认同步
                    .forResult(IMAGE_REQUESTION_CODE);//结果回调onActivityResult code
        }else if(num == 1){
            PictureSelector.create(activity)
                    .openGallery(PictureMimeType.ofImage())
                    .theme(R.style.picture_default_style)
                    .maxSelectNum(1)
                    .minSelectNum(1)
                    .imageSpanCount(3)// 每行显示个数
                    .selectionMode(PictureConfig.SINGLE)// 多选 or 单选
                    .previewImage(true)// 是否可预览图片
                    .isCamera(true)// 是否显示拍照按钮
                    .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
//                        .enableCrop(true)// 是否裁剪
//                        .compress(true)// 是否压缩
                    .synOrAsy(true)//同步true或异步false 压缩 默认同步
                    .forResult(IMAGE_REQUESTION_CODE);//结果回调onActivityResult code
        }

然后在OnActivityResult()里面判断类型,然后将选择的图片数据整理成Uri[],然后返回给刚才上面获取的ValueCallback

  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_OK){
            if( requestCode == IMAGE_REQUESTION_CODE){
                List<LocalMedia> localMedia = PictureSelector.obtainMultipleResult(data);
                ArrayList<Uri> objects = new ArrayList<>();
                for (int i = 0; i < localMedia.size(); i++) {
                    objects.add(Uri.fromFile(new File(localMedia.get(i).getPath())));
                }
                if(mFilePathCallback != null && objects.size() != 0){
                    Uri[] uris = new Uri[objects.size()];
                    Uri[] uris1 = objects.toArray(uris);
                    mFilePathCallback.onReceiveValue(uris1);
                }
            }
        }
    }

 

2013-10-12 18:07:36 ZZ7ZZ7ZZ 阅读数 1550
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    17842 人正在学习 去看看 高煥堂

1.html代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></meta>  
		<title>Android/Javascript互调Demo</title>
		<script type="text/javascript" language="javascript">
			function  callJavaScriptMethod()
			{
				document.getElementById("content").innerHTML = "Android 调用 Javascript 成功";
			}
		</script>
	</head>
	
	<body>
		<div ><a onClick="window.demo.callJavaMethod()" href="">点击-->JS调用Android代码</a></div>
		<div style="margin:50px 50px 50px 50px;" id="content"></div>
	</body>
</html> 



2.xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
		<WebView
			android:id="@+id/webview"
			android:layout_width="match_parent"
		    android:layout_height="wrap_content" />
		
		<Button
			android:id="@+id/androidCallJSBtn"
			android:layout_width="match_parent"
			android:layout_height="wrap_content"
			android:text="点击 Android 调用 JavaScript"/>
		
</LinearLayout>

3.Activity测试代码

package com.testwebview;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

	 private WebView mWebView;  
	 private Button androidCallJSBtn;
	 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
	}


    @SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" })
	private void initView() {
    	
        mWebView = (WebView) findViewById(R.id.webview);  
        WebSettings mWebSettings = mWebView.getSettings();  
       
        mWebSettings.setJavaScriptEnabled(true);   //加上这句话才能使用javascript方法  
        mWebView.addJavascriptInterface(new Object() {//增加接口方法,让html页面调用  

        	public void callJavaMethod() {  
               Toast.makeText(getApplicationContext(), "JS调用Android成功", Toast.LENGTH_LONG).show();
            }  
        	
        }, "demo");  
        mWebView.loadUrl("file:///android_asset/demo.html");  //加载页面  
        
        androidCallJSBtn = (Button) findViewById(R.id.androidCallJSBtn);  
        androidCallJSBtn.setOnClickListener(new Button.OnClickListener() {  //给button添加事件响应,执行JavaScript的fillContent()方法 
            public void onClick(View v) {  
                mWebView.loadUrl("javascript:callJavaScriptMethod()");  
            }  
        });  
    }  
}

4.效果图(依次是未调用前、android调用JS、JS调用android)

    


demo地址:http://download.csdn.net/detail/zz7zz7zz/6389669


没有更多推荐了,返回首页