Unity Android findViewById与webview插件制作
2018-01-14 16:23
941 查看
最近在给Unity3D接入各个Android运营平台的插件,其中有一个webview 功能用于显示玩家客服系统,上面还要上传图片
发现2个问题
之后将Eclipse工程中src目录导出成jar包,千万不要导出R类
导出方法工程右键->Export->Java->JAR file 只选择src文件夹
发现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; } }
相关文章推荐
- [转]Jollen 的 Android 教學,#6: WebView 體驗與 findViewByID
- Kotlin Android 扩展-替换findViewById()的超简洁插件
- Android Studio插件之快速findViewById butterknife和Android CodeGenerator的使用
- Jollen 的 Android 教学:WebView 体验与 findViewByID
- Android Studio插件GenerateFindViewById
- 关于android Activity中注解的使用,省去无用的findviewbyid....setonclick.....
- android中布局文件中的控件通过findviewbyid无法关联的解决方法
- Android中findViewById获取控件返回为空问题怎么解决
- android利用annotation代替findViewById()
- 简化 android findviewbyid
- Android中通过泛型解决findViewById需要强制类型转换的问题
- Kotlin Android Extensions: 与 findViewById 说再见 (KAD 04) -- 更新版
- 让python在android系统上飞一会儿:第四节 使用WebView制作程序界面
- Android:认识R类、findViewById方法查找组件、@string查找字符、@color查找颜色、@drawable查找图片、@dimen某个组件尺寸定义、项目引入资源国际化
- [Android-Tips] findviewbyid function returns null
- Android中怎样用@ViewInject注解来彻底放弃findViewByid,gogoog0!!!
- Android基于4.4以上沉侵式状态栏和继承BaseActivity不用findViewbyid得到控件id
- Android开发-- findViewById()方法得到空指针
- android findviewbyid的简单注解实现
- android findviewbyId 简化写法