2021年国家开放大学电大Android核心开发技术教学实践1答案教学实践1
怎么把项目导入到eclipseAndroid的五种传统布局分别为什么?
•LinearLayout(线性布局)
•RelativeLayout(相对布局)
•FrameLayout(帧布局)
•AbsoluteLayout(绝对布局)
•TableLayout(表格布局)
其中,最常用的布局是前三种,绝对布局用过一点,表格布局根本没用过(可能会很好用吧,但是前几种满足了我的日常需求)
使用zxing完成扫描二维码的初始化、扫描、结果提示功能,实现主要代码即可。
导入项目
@Override
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.main);
//初始化CameraManager
CameraManager.init(getApplication());
viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
txtResult = (TextView) findViewById(Result);
hasSurface = false;
inactivityTimer = new InactivityTimer(this);
}
打开Eclipse 导入源码中的Android 项目,然后右击项目选择“Build path”——》"Add External Archives" 把核心库core.jar文件加入到项目中。
此时编译一下项目,会发现报错,“Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" attribute?”之类的。打开raw 下的Values 发现错误是在一个<String>上。这里把“preferences_custom_product_search_summary” 里的%s %f 全部都改成%1$s %1$f(因为我们用不到多国语言,建议只保留默认的Value ,其他全部删除)。
原因:由于新的SDK采用了新版本的aapt(Android项目编译器),这个版本的aapt编译起来会比老版本更加的严格,然后在Android最新的开发文档的描述String的部分,已经说明如何去设置%s 等符号
“If you need to format your strings using String.format(String, ) , then you can do so by putting your format arguments in the string resource. For example, with the following resource: <string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
In this example, the format string has two arguments: %1$s is a string and %2$d is a decimal number. You can format the string with arguements from “
经过以上步骤后项目应该就可以运行了。
但是ZXing的android项目东西太多了,有很多是我们不需要的,得新建另一个项目简化它。简化
在开始前大致介绍一下简化ZXing需要用到各个包、类的职责。
•CaptureActivity。这个是启动Activity 也就是扫描器(如果是第一安装,它还会跳转到帮助界面)。
•CaptureActivityHandler 解码处理类,负责调用另外的线程进行解码。
•DecodeThread 解码的线程。
•ing.client.android.camera 包,摄像头控制包。
•ViewfinderView 自定义的View,就是我们看见的拍摄时中间的框框了。
新建另一个项目
新建另一个项目将启动的Activity命名为CaptureActivity,并导入核心库。项目新建完成后我们打开CaptureActivity 的布局文件,我这里为main。把里面的XML修改为:
<FrameLayout xmlns:android="schemas.android/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<SurfaceView android:id="@+id/preview_view"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:layout_centerInParent="true" />
<com.Zxing.Demo.view.ViewfinderView
android:id="@+id/viewfinder_view" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:background="@android:color/transparent" />
<TextView android:layout_width="wrap_content"
android:id="@+id/txtResult"
android:layout_height="wrap_content" android:text="@string/hello" />
</FrameLayout>
可以看到在XML里面用到了ViewfinderView 自定义view 。所以新建一个View 的包,然后把:ViewfinderView 和ViewfinderResultPointCallback 靠到里面(记得对应修改XML里面的包)。打开CaptureActivity 覆盖onCreate 方法:
这里调用到的CameraManager 类是控制摄像头的包里的类。新建一个camera包把:in
g.client.android.camera 里面的类全部拷入,另外我把PlanarYUVLuminanceSource 也拷入到这个包里面。根据错误的提示来修正代码,主要是修改正包结构。(整个简化的流程都是如此:“根据错误提示,修改代码”)。
在修改的过程中,有很多是关于R 资源的问题,在此我们需要将Values 里面的两个xml 资源文件拷入项目中:l 和l 。ctrl+b 一下看看error 是不是少了很多。在CameraManager中有些地方需要用到项目的配置,这里需要把配置直接写入代码中:
/ SharedPreferences prefs = DefaultSharedPreferences(context);
//是否使用前灯
// if (Boolean(PreferencesActivity.KEY_FRONT_LIGHT, false)) {
// ableFlashlight();
/
/ }
使用摄像头需要加入相应的权限:
<uses-permission
android:name="android.permission.CAMERA"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-feat ure android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.FLASHLIGHT"/>
当View 和camera 包里的错误修正完成后,我们继续来看CaptureActivity。
覆盖onResume方法初始化摄像头:
@Override
protected void onResume() {
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
SurfaceHolder surfaceHolder = Holder();
if (hasSurface) {
initCamera(surfaceHolder);
} else {
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
decodeFormats = null;
characterSet = null;
playBeep = true;
AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);
if (RingerMode() != AudioManager.RINGER_MODE_NORMAL) {
playBeep = false;
}
initBeepSound();
vibrate = true;
}
initCamera
private void initCamera(SurfaceHolder surfaceHolder) {
try {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论