开发SDK必备!保存游客登录的账号密码截图到本地。

最近一直在开发自己公司的SDK,前段时间把SDK的总体框架搭好了。就进入了实际功能的开发。SDK的第一个功能就是游客登录功能。换一种说法是试玩账号登录。就是由后台给用户分配账号和密码。用户可以跳过注册,和登录的步骤直接进入游戏体验。相信很多游戏都是会有这个功能的。所以我们公司也不例外!

废话少说,直接进入正题。先说说功能实现的需求,很简单。

1.用户点击游客登录时,弹出对话框提示用户:当前是试玩账号,要尽快绑定为正式账号,同时我们会保存试玩账号的截图到本地

2.通过一系列字段去请求后台,获取试玩账号和密码。然后显示到界面上

3.保存截图到本地。

需求就这么多,前面其实都很简单的。就是一些常规操作,接下来我要重点说的是,保存截图到本地。我是怎么实现的。因为我是使用Dialog方式显示的,刚开始使用了

	View dView = ((Activity) HWControl.getInstance().getContext()).getWindow().getDecorView();
		dView.setDrawingCacheEnabled(true);
		dView.buildDrawingCache();
		Bitmap bitmap1 = Bitmap.createBitmap(dView.getDrawingCache());

这种方式进行截图的。但是这就有很大的问题了!因为这个getDecorView只能获取到对应activity的顶层view。而Dialog是悬浮在activity之上的。所以截取出来的图,是没有Dialog的。好了,我想activity不行的,那我直接用Dialog对象对获取截图。于是就有了下面的代码

//如果需要同时保存打开的dialog的截图,可以这么做,如果不需要,上面的bitmap就是当前activity的截图了。
	    View dialogView = LoginTrialDialog.getInstance().getDialog().getWindow().getDecorView();
	    LogUtils.e("dialogView---->"+dialogView);
	    int location2[] = new int[2];
	    dialogView.getLocationOnScreen(location2);
	    dialogView.setDrawingCacheEnabled(true);
	    dialogView.buildDrawingCache();

但是这还是有问题的,就是截出来的图,高度是不对的。这是什么问题,我目前还没有找不出来。因为这个问题,让我浪费了很多时间。换了很多种姿势去截这块图,就是截出来不正常。后来灵机一动,我发现我没必要一直纠结怎么去截图实现这个功能啊。我可以直接通过canvas 去画出来。然后保存为本地图片。这样一来我就不用想怎么去截图了。

我可以通过canvas 拿到相应的资源,去画出来。直接上代码

/**
		 * 我们先画要保存的图
		 */
		Bitmap localBitmap1 = getBitmap(paramContext, "fg_guest_find_uid");//背景图片
		int width = localBitmap1.getWidth();
		int height = localBitmap1.getHeight();
		Bitmap localBitmap2 = Bitmap.createBitmap(width, height,
				Bitmap.Config.ARGB_8888);
		Canvas localCanvas = new Canvas(localBitmap2);//绘制背景
		localCanvas.drawBitmap(localBitmap1, 0.0F, 0.0F, null);
		Paint localPaint = new Paint();//获取画笔
		localPaint.setColor(ResLoader.getColor(paramContext, "fg_find_text"));//设置画笔颜色
		localPaint.setAntiAlias(true);
		localPaint.setFilterBitmap(true);
		localPaint.setTextSize(20);
		localCanvas.drawText(paramString3,
				(width - getFontlength(localPaint, paramString3)) / 2.0F,
				height * 665 / 1920, localPaint);//根据位置 绘制相应的账号密码等
		localCanvas.drawText(paramString1,
				(width - getFontlength(localPaint, paramString1)) / 2.0F,
				height * 980 / 1920, localPaint);
		localCanvas.drawText(paramString2,
				(width - getFontlength(localPaint, paramString2)) / 2.0F,
				height * 1280 / 1920, localPaint);
		localCanvas.save(31);
		localCanvas.restore();

画出图片后,接下来就是保存图片了。

/**
		 * 保存图片到本地
		 */
		String str1 = Constant.GAME_FILE_PATH + paramContext.getPackageName();
		LogUtils.e("保存图片路径名str1----->" + str1);
		String str2 = str1 + File.separator + paramString + ".jpg";
		LogUtils.e("保存图片路径名str2----->" + str2);
		File localFile1 = new File(str1);
		File localFile2 = new File(str2);
		if (!localFile1.exists()) {
			localFile1.mkdirs();
		}
		try {
			if (localFile2.exists()) {
				localFile2.createNewFile();
			}
			LogUtils.e("这里执行了---->"+localFile2.getPath());
			FileOutputStream localFileOutputStream1 = new FileOutputStream(localFile2);
			paramBitmap.compress(Bitmap.CompressFormat.JPEG, 100,
					localFileOutputStream1);
			Intent localIntent = new Intent(
					"android.intent.action.MEDIA_SCANNER_SCAN_FILE");
			localIntent.setData(Uri.fromFile(localFile2));
			paramContext.sendBroadcast(localIntent);
		} catch (FileNotFoundException e) {

			LogUtils.e("fileNotFoudExceptrin---->"+e.toString());
			
		} catch (IOException ex) {
			LogUtils.e("IOException---->"+ex.toString());
		}

最后去看一波手机里面图库,很完美!我要的图,很安详地趟在图库里面了。通过这一个功能我总结了一个经验,有时候我们拿到一个需求的时候,太在乎怎么做,却忘记了为什么做。通往目标的路,都不是只有一条的。这条路走不通,我们就开始选择换条路前进了。

扫描二维码关注公众号,回复: 2460884 查看本文章

我是一名Android工程师,我为自己加油!

猜你喜欢

转载自blog.csdn.net/ruan_number3/article/details/79760743
今日推荐