第三个项目部分bug集

来源:互联网 发布:js倒计时刷新页面 编辑:程序博客网 时间:2024/05/22 17:02

(一)获取系统图片路径为null

参照:吴小龙同学的博客

(二)superNotCallException

出现原因:在onRestart()方法中没有调用super.Restart()

过程:这个bug是出现在绑定设备当中的,绑定设备需要同意条款,和登陆注册一样一般需要勾选一个checkbok,先同意条款才能进行后面的操作,客户的需求是默认条款未选中,当用户点击进入阅读条款后,回到界面就默认勾选了,所以我就在onRestart中写了个

 @Override    protected void onRestart() {        if (isRead == true) {            mIdReadImg.setSelected(true);        }    }

问题就出在这,因为我粗心把super.Restart()给删掉了,与其说是粗心,不如说是没有理解,其实一直不知道这个super.Restart有什么作用,因为进入查看源码是这样的、

 protected void onRestart() {        throw new RuntimeException("Stub!");    }

只是抛了个异常,并没有做什么事情,所以总觉得他没用,

protected void onRestart() {        throw new RuntimeException("Stub!");    }

其实不是这样的,这个onRestart()调用的是framework层的代码,之所以看不到源码是因为androidStudio没有关联源码,看了这篇文章关联源码AndroidStudio关联系统源码 还是不能正常查看Restart里面的源码,总之一点是可以确定的,onRestart里面绝对不仅仅是抛了个异常,而是做了许多事情,写在framework里面,暂时无法查看

解决方式:在重写的onRestart中调用super.Restart()

  @Override    protected void onRestart() {        super.onRestart();        if (isRead == true) {            mIdReadImg.setSelected(true);        }    }

(三)图片二维码扫描和图片二维码识别

出现原因:为了适配6.0对zxing中的相关代码做了些许调整,在调整的过程中出现了问题,导致后面的问题

过程:由于6.0对权限做了处理,许多权限都需要动态添加,其中有一个错误就是图片二维码识别的时候出现的,由于只动态添加了照相机的权限,并没有动态添加读取sdcard的权限,而且报的错也没有明确提示是权限问题,这里耽误了些时间,还有一个问题就是识别二维码图片是遇到的

    /**     * 获取从相册返回来的图片路径     *     * @param requestCode     * @param resultCode     */    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {        super.onActivityResult(requestCode, resultCode, intent);        if (resultCode == RESULT_OK) {            switch (requestCode) {                case REQUEST_CODE:                    String[] proj = {MediaStore.Images.Media.DATA};                 //这里错在将intent解析成uri而不是通过    intent.getdata来获取uri                    //Uri uri = geturi(intent);                    // 获取选中图片的路径                    Cursor cursor = getContentResolver().query(intent.getData(),                            proj, null, null, null);                    if (cursor.moveToFirst()) {                        int column_index = cursor                                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);                        photo_path = cursor.getString(column_index);                        if (photo_path == null) {                            photo_path = Utils.getAbsolutePath(getApplicationContext(),                                    intent.getData());                            Log.i("123path  Utils", photo_path);                        }                    }                    cursor.close();                    /**                     * 开启线程识别                     */                    new Thread(new Runnable() {                        @Override                        public void run() {                              /*这个result就是返回的扫描的结果*/                            Result result = scanningImage(photo_path);                            // String result = decode(photo_path);                            Log.d(TAG, "=====result:" + result);                            if (result == null) {                                Looper.prepare();                                Toast.makeText(getApplicationContext(), "图片格式有误", Toast.LENGTH_SHORT)                                        .show();                                Looper.loop();                            } else {                                Log.i("123result", result.toString());                                // Log.i("123result", result.getText());                                // 数据返回                                String recode = recode(result.toString());                                Intent data = new Intent();                                data.putExtra("codedContent", recode);                                setResult(RESULT_OK, data);                                finish();                            }                        }                    }).start();                    break;            }        }    }

代码中指出,在query方法中的第一个参数需要传入一个uri,直接通过intent.getdata获取到数据就ok,不用将intent转成uri

解决方法:直接通过intent.getData()获取uri不需要另外转换

(四)上传图片遇到的问题(base64上传url链接太长)Request uri too Large

出现原因:图片路径转成base64后,url边长,超过了限制

过程:我们的图片上传使用的是base64,post请求,将图片路径转换成base64后,路径边长,且内存变大,理论上post请求长度是不受限制的,但是如果超过一定长度还是会有问题,而且上传时间会很久

解决方案:将base64上传改成文件上传的形式就ok了

(五)调用系统相机拍照并且更新到相册

出现原因:没有搞清楚原理,逻辑错误

过程:在开启相机拍照然后拍完及时把照片更新到相册,当时百度到一篇文章,然后根据经验主义把一个创建文件的工具类拿来用,由于是工具类就没怀疑它的正确性,其实问题就出在这个工具类中,获取到的文件夹路径为空,后来省去工具类直接创建文件夹,获取的文件夹路径就不为空了

解决方案:调用系统相机拍照并更新图库的做法是
1,开启系统相机时指定MediaStore.EXTRA_OUTPUT

                Intent imageCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath();                String name = System.currentTimeMillis() + ".jpg";                mImagePath = new File(rootPath + "/aihuijia/", name);                if (!mImagePath.exists()) {                    mImagePath.getParentFile().mkdir();                }                imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mImagePath));// 设置图片输出路径                imageCaptureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);                startActivityForResult(imageCaptureIntent, CAMERA_CODE);

2,开启相机时,如果指定了目标uri,data就没有数据,如果没有指定uri,则data就返回有数据所以在onActivityResult中不能通过intent去取值,而是直接往相册中插入一条数据

  //往相册中插入一条数据                MediaStore.Images.Media.insertImage(getContentResolver(), mImagePath.getAbsolutePath(), mImagePath.getName(), null);//图片插入到系统图库

3,然后发送广播,通知系统更新相册

 //发送广播,通知更新相册            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + mImagePath.getAbsolutePath())));//通知图库刷新

全部代码,可以直接拿来用

  • 开启相机
 String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath();                String name = System.currentTimeMillis() + ".jpg";                mImagePath = new File(rootPath + "/aihuijia/", name);                if (!mImagePath.exists()) {                    mImagePath.getParentFile().mkdir();                }                imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mImagePath));// 设置图片输出路径                imageCaptureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);                startActivityForResult(imageCaptureIntent, CAMERA_CODE);
  • 接收返回值并处理
  // 相机拍照完成后,返回图片路径        if (requestCode == CAMERA_CODE && resultCode == RESULT_OK) {            try {                //往相册中插入一条数据                MediaStore.Images.Media.insertImage(getContentResolver(), mImagePath.getAbsolutePath(), mImagePath.getName(), null);//图片插入到系统图库            }catch (FileNotFoundException e) {                e.printStackTrace();            }            //发送广播,通知更新相册            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + mImagePath.getAbsolutePath())));//通知图库刷新        }

(六)java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String com.zbys.courze.bean.CircleDetailEntity$UserListBean.getHeadportrait()’ on a null object reference

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.zbys.courze.bean.CircleDetailEntity$UserListBean.getHeadportrait()' on a null object reference 

这个问题是对象为空的情况下,还去通过这个空对象去调用里面的方法而产生的,比如:String headportrait = mList.get(position).getHeadportrait();

我这个mList集合是空的,还通过集合的去获取里面的Headportrait就会报这个错,解决方法就是先判断集合是否为空,不过我这里出现的原因是,我在传用户id的时候没有判断是否为0,0表示用户不存在,所以后台查不到这个用户,返回了null

总结:传id的时候记得判断是否为空或者为0,用户头像链接也是如此

(七)null容错处理

对任何一个对象都要记得做非空判断,非空判断String类型使用TextUtils包下的isEmpty()方法判断,其他类型使用==null判断,特别对象声明在全局的类中,独立的方法中使用了这个全局的对象,那么也要做非空判断的容错处理,这个问题不能轻视

1 0
原创粉丝点击