Android与js交互上传图片

第一步:获取网络权限,读写文件权限

<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

第二步:加载本地写好的html文件(定义好js提供给Android的调用方法jsCallAndroid()和安卓提供给js的调用接口upload())放在assets目录下。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
body{
text-align: center;
}
.one{
border: 3px solid blue;
}
.two{
border: 3px solid transparent;
}
</style>
</head>
<body>
<img id="photo" class="one" src="img/image3.png" width="300" height="300"/><br>
<button id="btn_jscallandroid" onclick="jsCallAndroid()">点击上传</button>

<script type="text/javascript">

    function jsCallAndroid(){
        var str="点击上传";
        /*objName就是在android客户端通过代码注入的java对象*/
        objName.upload();
    }

    function setImag(path){
        document.getElementById("photo").src=""+path
    }

    function androidCallJsAddBorder(){
        document.getElementById("photo").className="one";
    }

    function androidCallJsRemoveBorder(){
        document.getElementById("photo").className="two";
    }
</script>
</body>
</html> 

第三步:Android部分代码:

public class MainActivity extends AppCompatActivity {

    private WebView mWebView;
    private Button mBtnAddBorder;
    private Button mBtnRemoveBorder;
    private SweetAlertDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
        initData();
        initListener();
    }

    /**
    * 初始化UI
    */
    private void initViews() {
        mWebView = (WebView) findViewById(R.id.webview);
        mBtnAddBorder = (Button) findViewById(R.id.btn_addborder);
        mBtnRemoveBorder = (Button) findViewById(R.id.btn_removeborder);
    }

    private void initData() {
        WebSettings settings = mWebView.getSettings();
        //设置编码
        settings.setDefaultTextEncodingName("utf-8");
        //支持js
        settings.setJavaScriptEnabled(true);
        settings.setBlockNetworkImage(false);
        //设置本地调用对象及其接口
        mWebView.loadUrl("file:///android_asset/html/webview2js.html");
        //第二个参数相当于对象名,要和js中保持一致
        mWebView.addJavascriptInterface(new Test(), "objName");
    }

    private void initListener() {
        //调用js方法给图片移除边框
        mBtnRemoveBorder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mWebView.loadUrl("javascript: androidCallJsRemoveBorder()");
            }
        });

        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl("file:///android_asset/html/webview2js.html");
                return true;
            }
        });

        //调用js方法给图片增加边框
        mBtnAddBorder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //调用无参方法 假如有参的话 例如传一个字符串 
                 //需要在括号中用单引号把要传的字符串引起来 整型变量 直接写即可
                mWebView.loadUrl("javascript: androidCallJsAddBorder()");
            }
        });
    }


    class Test {
        /**
        * 这里需要注意的是,在Android4.2.2及之后的版本只有带有
        * JavascriptInterface注释的public方法才能够被js访问。
        * 所以要在show()方法前加:@JavascriptInterface
        */
        @JavascriptInterface
        public void upload() {
            dialog = new SweetAlertDialog(MainActivity.this);
            dialog.setCanceledOnTouchOutside(true);
            dialog.setTitleText("请选择获取头像方式!")
               .setCancelText("打开相册")
               .setConfirmText("打开相机")
               .setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() {
                   @Override
                   public void onClick(SweetAlertDialog sweetAlertDialog) {
                       //打开相册
                       openAlbum();
                   }
               })
               .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                   @Override
                   public void onClick(SweetAlertDialog sweetAlertDialog) {
                       //打开相机
                       openCamera();
                   }
               }).show();
        }
    }

    /**
    * 打开相册
    */
    private void openAlbum() {
        Intent mIntent = new Intent(Intent.ACTION_PICK);
        //mIntent.addCategory(Intent.CATEGORY_OPENABLE);
        mIntent.setType("image/*");
        startActivityForResult(mIntent, 1);
        dialog.dismiss();
    }

    /**
    * 打开相机
    */
    private void openCamera() {
        //拍照上传
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //下面这句指定调用相机拍照后的照片存储的路径
        if (SDCardUtils.getInstance().ExistSDCard()) {
            File tempFile = new File(Environment.getExternalStorageDirectory()
            + "/androidtojs/" + "photo.jpg");
            if (!tempFile.exists()) {
                tempFile.getParentFile().mkdirs();
            }
            // 从文件中创建uri
            Uri uri = Uri.fromFile(tempFile);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        }
        startActivityForResult(intent, 2);
        dialog.dismiss();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 1: //打开相册返回
            try {
                if (data != null) {
                    Uri uri = data.getData(); // 返回的是一个Uri
                    if (uri != null) {
                        String path = UriUtils.getInstance()
                           .getPath(MainActivity.this, uri);
                        if (path == null || path.equals("")) {
                            Toast.makeText(MainActivity.this, "没找到图片
                               ,请拍照",Toast.LENGTH_SHORT).show();
                            return;
                        }
                        File s = new File(path);
                        if (s.exists()) {
                            Toast.makeText(MainActivity.this, path, 
                               Toast.LENGTH_SHORT).show();
                            mWebView.loadUrl
                               ("javascript:setImag('" + path + "')");
                        } else {
                            Toast.makeText(MainActivity.this,  "没找到图片,
                                请拍照",Toast.LENGTH_SHORT).show();
                        }
                    }
                } else {
                    Toast.makeText(MainActivity.this, "没找到图片
                       ,请拍照", Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
            }
            break;
          case 2: //打开相机返回
            if (resultCode == RESULT_OK) {
                //处理拍照
                if (SDCardUtils.getInstance().ExistSDCard()) {
                    File temp = new File(Environment.getExternalStorageDirectory()
                       + "/androidtojs/" + "photo.jpg");
                    if (!temp.exists()) {
                        temp.getParentFile().mkdirs();
                    }
                    String path = temp.getPath();
                    mWebView.loadUrl("javascript:setImag('" + path + "')");
                } else {
                    Toast.makeText(MainActivity.this, "未找到存储卡,
                       无法存储照片!", Toast.LENGTH_SHORT).show();
                }
            }
            break;
        }
    }
} 

注意:该程序在安卓6.0下拍照上传之后显示不了的解决方法:
在build.gradle下把targetSdkVersion设置为22 ,因为安卓6.0需要获取存取权限。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值