您的位置:首页 > 移动开发 > Unity3D

Unity Android findViewById与webview插件制作

2018-01-14 16:23 941 查看
最近在给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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: