解决使用第三方扫描二维码后返回界面出现的OpenGL error 0x0502

来源:互联网 发布:unity3d 流媒体播放 编辑:程序博客网 时间:2024/06/06 14:24

在使用Zxing第三方sdk扫描二维码扫描之后,返回游戏后台一直报OpenGL error 0x0502:.........然后界面显示图片完全变形或者显示不全之类的绘制问题。

原来后台运行的app,是不允许进行openGL绘制的,而且Android的图形的渲染要比OpenGL慢0.5秒左右,所以会出现绘制混乱,解决办法就是让扫描处理结果的对象晚于界面绘制的时间,也就是当返回游戏时处理结果晚于 0.5秒后刷新sufaceview,具体如下:

(该类是单独拿出创建与生成二维码)

package org.bojoy.gui;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.lang.ref.WeakReference;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import org.bojoy.zxing.activity.CaptureActivity;import org.bojoy.zxing.encoding.EncodingHandler;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.preference.PreferenceManager.OnActivityResultListener;import android.util.Log;import android.widget.Toast;import com.google.zxing.WriterException;/** * @author luzhenyu * BJMQRScanHelp 二维码扫描与生成类 */public class BJMQRCodeHelpler implements OnActivityResultListener {private static Handler sHandler = null;private static WeakReference<Context> sContext = null;private static WeakReference<Activity> sActivity = null;private static String resultStr = null;private static Object sycObject = new Object();public static final int MSG_CREATE_QR_IMG = 0;public static final int MSG_GET_QR_RESULT = 1;private static final String PARAM_CONTENT = "strData";private static final String PARAM_IMAGPATH = "strImagePath";private static boolean isExist = false;private final static int REQUEST_CODE = 1234098;private static native void nativeNotifyScanResult(final String resultStr);// by luzhenyu add BroadcastReceiver catch onResume and onDestroyprivate final String ACTION = "BjmProxyMediator";private OnMediatorReceiver mediatorRecevier = new OnMediatorReceiver();public BJMQRCodeHelpler(Context context) {sContext = new WeakReference<Context>(context);sActivity = new WeakReference<Activity>((Activity) context);InitHandler();// by luzhenyu        IntentFilter filter = new IntentFilter();          filter.addAction(ACTION);          //动态注册BroadcastReceiver          sActivity.get().registerReceiver(mediatorRecevier, filter);         Log.i("BJMEngine", "BJMQRCodeHelper register mediatorRecevier");}private static void InitHandler() {sHandler = new Handler() {public void handleMessage(Message msg) {synchronized (this) {switch (msg.what) {case MSG_GET_QR_RESULT:getQRCodeStr();break;case MSG_CREATE_QR_IMG:createQRCodeImg(msg.getData().getString(PARAM_CONTENT), msg.getData().getString(PARAM_IMAGPATH));break;}}}};}/** 供c++ 扫描二维码方法调用*/public static void InvokeCreateViewQRScan() {if (isExist) {return;}isExist = true;sHandler.sendEmptyMessage(MSG_GET_QR_RESULT);}/** 供c++ 生成二维码方法调用*/public static void InvokeCreateQRImg(String strData, String strImagePath) {if (isExist) {return;}isExist = true;Message message = new Message();message.what = MSG_CREATE_QR_IMG;Bundle bundle = new Bundle();bundle.putString(PARAM_CONTENT, strData);bundle.putString(PARAM_IMAGPATH, strImagePath);message.setData(bundle);sHandler.sendMessage(message);synchronized (sycObject) {try {sycObject.wait();} catch (InterruptedException e) {e.printStackTrace();}}isExist = false;}/** * 扫描二维码 *  * @return resultStr * */public static void getQRCodeStr() {Intent intent = new Intent();intent.setClass(sActivity.get(), CaptureActivity.class);sActivity.get().startActivityForResult(intent, REQUEST_CODE);}private static Method invokeRunOnGLThreadMethod() {try {/** * 通过反射来执行Cocos2dxActivity.runOnGLThread */// 来获取传来类名String ClassName = "org.cocos2dx.lib.Cocos2dxActivity";// 得到类名来然后创建classClass<?> clazz = Class.forName(ClassName);// 得到方法名字String methodName = "runOnGLThread";// 获得MethodMethod m = clazz.getDeclaredMethod(methodName,new Class[] { Runnable.class });return m;} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();}return null;}/** * 在指定路径生成二维码 *  * @param strData *            要生成的内容 * @param strImagePath *            二维码生成保存路径 * */public static void createQRCodeImg(String strData, String strImagePath) {File file = null;FileOutputStream fos = null;try {file = new File(strImagePath);fos = new FileOutputStream(file);String contentString = strData;if (contentString != null && contentString.trim().length() > 0) {// 根据字符串生成二维码图片并显示在界面上,第二个参数为图片的大小(500*500)Bitmap qrCodeBitmap = EncodingHandler.createQRCode(contentString, 500);qrCodeBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);// 压缩bitmap写进outputStream 参数:输出格式 输出质量 目标OutputStream// 格式可以为jpg,png,jpg不能存储透明fos.flush();fos.close();// 关闭流} else {Toast.makeText(sActivity.get(), "Text can not be empty",Toast.LENGTH_SHORT).show();}} catch (WriterException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {synchronized(sycObject) {sycObject.notify();}}}@Overridepublic boolean onActivityResult(int requestCode, int resultCode, Intent data) {// 处理扫描结果if (requestCode == REQUEST_CODE) {if (resultCode == CaptureActivity.RESULT_OK) {Bundle bundle = data.getExtras();String scanResult = bundle.getString("result");resultStr = scanResult;return true;}}isExist = false;return false;}// by luzhenyuprivate void runGLThread() {if (!isExist) {return;}try {Log.i("BJMEngine", "runGLThread qrcode result");Method m = invokeRunOnGLThreadMethod();if (m == null) {isExist = false;}m.invoke(sActivity.get(), new Runnable() {@Overridepublic void run() {BJMQRCodeHelpler.nativeNotifyScanResult(resultStr);/** 返回扫描结果*/}});} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}isExist = false;}// by luzhenyupublic class OnMediatorReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(ACTION)) {String name = intent.getExtras().getString("param"); if (name.equalsIgnoreCase("onResume")) {runGLThread();} elseif (name.equalsIgnoreCase("onDestroy")) {Log.i("BJMEngine", "BJMQRCodeHelper unregister mediatorRecevier");sActivity.get().unregisterReceiver(mediatorRecevier);}}}}}


0 0
原创粉丝点击