Unity Android findViewById与webview插件制作

本文介绍了解决Unity3D项目中WebView组件在Android平台上遇到的问题:一是通过findViewById获取对象为空导致的错误,二是WebView内嵌H5页面中默认不支持图片上传的功能扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在给Unity3D接入各个Android运营平台的插件,其中有一个webview 功能用于显示玩家客服系统,上面还要上传图片
发现2个问题

1、按照正常的工程来做,发现findViewById返回了一个null 导致了空指针异常。无论是直接用Unity编译apk还是用Unity导出Android工程,都会出现该问题。经过各种查找,最终找到了问题的原因。

问题的原因主要在于,在我们将自己的android工程打成jar插件时,原来的R.id.xxxxx已经被转换成相应的数字id编译进了jar包,而Unity3D在导出工程或是apk的时候,会对所有资源进行重新的id编译,这就导致我们jar中的旧id是无法获取到相应对象。解决办法如下:

//this.wv=(WebView)findViewById(R.id.ifree_brow_webview);  
int webviewID = getResources().getIdentifier("ifree_brow_webview", "id", getPackageName());  
this.wv = (WebView)findViewById(webviewID);  

之后将Eclipse工程中src目录导出成jar包,千万不要导出R类

导出方法工程右键->Export->Java->JAR file 只选择src文件夹

2、webview内嵌h5页面中,默认安卓webview不支持上传图片要扩展下webview

代码要Android5.0以上

package com.pwrd.onesdk.demo;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ClipData;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

@SuppressLint("SetJavaScriptEnabled")
public class WebViewActivity extends Activity {

    private WebView webView;
    private Button close;
    private ValueCallback<Uri> mUploadMessage;
    private ValueCallback<Uri[]> mUploadMessages;
    private static int FILECHOOSER_RESULTCODE = 1001;
    private RelativeLayout mLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        this.setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);

        mLayout = new RelativeLayout(this);

        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);
        webView = new WebView(getApplicationContext());
        webView.setLayoutParams(params);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setAppCacheEnabled(true);
        webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
        webView.getSettings().setDomStorageEnabled(true);
        webView.getSettings().setAllowFileAccess(true);
        webView.getSettings().setAllowFileAccess(true);

        webView.getSettings().setDatabaseEnabled(true);

        Intent intent = getIntent();
        String url = intent.getStringExtra("urlstr");
        webView.loadUrl(url);

        webView.setWebViewClient(new WebViewClient() {  
            @Override  
            public boolean shouldOverrideUrlLoading(WebView view, String url) {   
                view.loadUrl(url);  
                return true;  
            }  
        });

        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                return super.onJsAlert(view, url, message, result);
            }

            @Override
            public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                return super.onJsConfirm(view, url, message, result);
            }

            // For Android 5.0+ 重点重点
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
                if (mUploadMessage != null)
                    return;
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("*/*");
                startActivityForResult(Intent.createChooser(i, "File Chooser"), WebViewActivity.FILECHOOSER_RESULTCODE);
            }

            // For Android < 3.0
            public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                openFileChooser(uploadMsg, "");
            }

            // For Android > 4.1.1
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                openFileChooser(uploadMsg, acceptType);
            }

            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,
                    FileChooserParams fileChooserParams) {
                if (mUploadMessages != null)
                    return false;
                mUploadMessages = filePathCallback;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("*/*");
                startActivityForResult(Intent.createChooser(i, "文件选择"), WebViewActivity.FILECHOOSER_RESULTCODE);
                return true;
            }
        });

        mLayout.addView(webView);

        Button btn = new Button(this);
        btn.setText("close");
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        btn.setLayoutParams(layoutParams);
        btn.setGravity(Gravity.BOTTOM);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                WebViewActivity.this.finish();

            }
        });
        mLayout.addView(btn);

        setContentView(mLayout);

        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == FILECHOOSER_RESULTCODE) {
            if (null != mUploadMessage) {
                Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
                mUploadMessage.onReceiveValue(result);
                mUploadMessage = null;
            }
            if (null != mUploadMessages) {
                Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
                onActivityResultAboveL(requestCode, resultCode, intent);
            }
        }
    }

    @SuppressLint("NewApi")
    private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {
        if (requestCode != FILECHOOSER_RESULTCODE || mUploadMessages == null)
            return;
        Uri[] results = null;
        if (resultCode == Activity.RESULT_OK) {
            if (intent != null) {
                String dataString = intent.getDataString();
                ClipData clipData = intent.getClipData();
                if (clipData != null) {
                    results = new Uri[clipData.getItemCount()];
                    for (int i = 0; i < clipData.getItemCount(); i++) {
                        ClipData.Item item = clipData.getItemAt(i);
                        results[i] = item.getUri();
                    }
                }
                if (dataString != null)
                    results = new Uri[] { Uri.parse(dataString) };
            }
        }
        mUploadMessages.onReceiveValue(results);
        mUploadMessages = null;
    }
}
UniWebView是用于移动Unity3D游戏的现代Web视图组件。将网页内容集成到游戏中从未如此简单。什么是UniWebView UniWebView是一个Unity 3D插件,用于将Web视图组件添加到Unity 3D手机游戏中。UniWebView在C#中包含一组抽象的高级API,它们包装了iOS和Android平台的本机API。借助UniWebView,您可以在不了解本机开发的情况下将某些行为(例如浏览器)插入游戏。当您需要显示公告或通知,为玩家排名添加排行榜或仅向用户显示任何网页时,此功能非常有用。 #支持的平台 UniWebView支持运行: iOS 9.0或以上 Android 5.0(API级别21)或更高版本 在iOS上,UniWebView WKWebView用作渲染组件。在Android WebView上使用。 UniWebView还包含macOS上的Unity Editor支持,用于调试目的。如果要在Mac上开发游戏,则可以直接在Unity Editor的播放模式下打开独立的Web视图。如果您在Windows PC上工作,则仍可以在移动设备上构建和使用UniWebView,但是无法在Windows Unity编辑器中直接查看结果。 该编辑器插件是功能齐全的各种移动版本。尽管UniWebView是为移动平台设计的,但如果需要,您也可以将其放入独立的macOS游戏中。 #版本3 UniWebView项目始于2013年。UniWebView的原始版本支持Unity4。在Unity 5中,Unity团队更改了本机插件工作方式的方法,并且无法在同一插件版本中同时支持Unity 4和5。因此,我们决定对版本2进行重大升级。经过几年的开发,UniWebView 2现在非常稳定。但是,遗留代码仅UIWebView在iOS上支持旧样式(并且已弃用),并且我们还必须考虑向后兼容性,并且也必须使用过时的API WebView。 我们对这种情况不满意。如果我们使用最新技术,则性能和代码质量可能会大大提高。添加功能和解决问题也将更加容易和快捷。这就是我们决定从头开始重写UniWebView的原因。在版本3中,我们再次从0开始,并重新设计了几乎所有API。凭借过去几年的发展经验,我们有机会使美好的事物变得更好,而糟糕的设计也就消失了。 已经在使用UniWebView 2?请查看第3版的重点内容,以了解它是如何从以前的版本演变而来的。请注意,版本3版本2不兼容。如果要从UniWebView 2升级,则不妨对迁移指南进行简要介绍。大多数概念是相似的,但可能仍需要一段时间才能升级。我们还建议您阅读我们的文档,以将UniWebView的潜在功能带到您的项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值