【每日练手】history:
【Android】【Java】【每日练手1】字符串的二维码生成器
基于zxing开发一个android软件,一个按钮打开摄像头,摄像头的内容会显示到手机屏幕,然后以尽可能快的方式调用zxing对每一帧画面进行二维码扫码,如果扫描到了二维码,那就滴一声后跳转到二维码扫描结果界面,这个功能很像微信扫码。
源码:
javapackage com.example.gen_qr_code;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.Nullable;
import android.content.Intent;
import android.widget.Button;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
public class MainActivity extends AppCompatActivity {
private Button scanButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
scanButton = findViewById(R.id.scanButton);
scanButton.setOnClickListener(v -> {
// 打开摄像头并显示预览
IntentIntegrator integrator = new IntentIntegrator(MainActivity.this);
integrator.setBeepEnabled(true);
integrator.setCameraId(0); // 选择摄像头,0为后置摄像头,1为前置摄像头
integrator.setOrientationLocked(false); // 是否锁定屏幕方向
integrator.initiateScan();
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 处理扫描结果
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (result != null) {
String contents = result.getContents();
if (contents != null && !contents.isEmpty()) {
// 扫描成功,可以根据需要进行处理
Intent intent = new Intent(this, ScanResultActivity.class);
intent.putExtra("scan_result", contents);
startActivity(intent);
}
}
}
}
在这段代码里,这个IntentIntegrator库在内部开启了新的activity,扫描后结果给到@Nullable Intent data:
// 打开摄像头并显示预览 IntentIntegrator integrator = new IntentIntegrator(MainActivity.this); integrator.setBeepEnabled(true); integrator.setCameraId(0); // 选择摄像头,0为后置摄像头,1为前置摄像头 integrator.setOrientationLocked(false); // 是否锁定屏幕方向 integrator.initiateScan();
onActivityResult是一个回调方法,用于处理在Activity中启动其他Activity并等待返回结果的情况。当启动的Activity结束并返回结果时,系统会调用onActivityResult方法来接收返回的结果数据。
在给定的代码中,onActivityResult方法被重写并添加了自定义的处理逻辑。当调用initiateScan()方法启动扫描界面后,用户完成扫描并返回结果后,系统会调用onActivityResult方法,并将结果数据传递给该方法的参数中(requestCode、resultCode和data)。在该方法内部,通过IntentIntegrator.parseActivityResult方法解析扫描结果,并判断是否成功扫描到内容。如果扫描成功,则将结果数据传递给ScanResultActivity并启动该Activity显示扫描结果。
这段代码是在onActivityResult方法中,用于启动一个新的Activity(ScanResultActivity)来显示扫描结果。
解释如下:
创建一个新的Intent对象:Intent intent = new Intent(this, ScanResultActivity.class);
Intent是用于在不同组件之间传递数据的对象。这里创建了一个新的Intent对象,用于指定要启动的Activity和传递的数据。
this表示当前的上下文,即MainActivity。
添加额外的数据到Intent中:intent.putExtra("scan_result", contents);
putExtra方法用于将额外的数据添加到Intent中。这里将扫描结果数据存储在名为"scan_result"的键下。
contents是从扫描结果中获取的具体内容。
启动Activity:startActivity(intent);
startActivity方法用于启动指定的Activity,并传递之前创建的Intent对象作为参数。
这将导致系统启动ScanResultActivity并显示扫描结果。
通过以上代码,当扫描成功并获得内容后,MainActivity会创建一个带有扫描结果数据的Intent,然后使用该Intent启动ScanResultActivity,以便显示扫描结果给用户查看。
java Intent intent = new Intent(this, ScanResultActivity.class);
intent.putExtra("scan_result", contents);
startActivity(intent);
@Nullable是一个注解,用于表示参数可以为空。在这个特定的代码中,@Nullable Intent data表示data参数可以为空。
在onActivityResult方法中,系统会传递扫描结果的数据给data参数。这里使用@Nullable注解是为了明确指出data参数可以为null,以应对在某些情况下没有返回数据的情况(例如用户取消了扫描操作)。
在方法体内部,代码通过使用IntentIntegrator.parseActivityResult方法来解析传递的数据,其中data参数被用来传递扫描结果。在后续的逻辑中,会对data参数进行判断,以确保在有有效的扫描结果时才进行进一步处理。
@Nullable Intent data表示data参数可以为空,用于接收从其他Activity返回的数据,这里用于接收扫描结果的数据。
在一个Activity里启动另外一个Activity只有startActivity(intent)才可以?不是的。
除了使用startActivity(intent)方法之外,还有其他方法可以启动另一个Activity。以下是一些常用的方法:
startActivityForResult(intent, requestCode): 该方法用于启动一个Activity,并期望获取返回的结果。可以通过requestCode参数指定一个标识码,以便在返回结果时进行区分。在目标Activity中通过setResult(resultCode, data)方法设置返回结果,并通过finish()方法关闭目标Activity,然后在调用该方法的Activity中的onActivityResult()方法中获取返回的结果。
startActivityIfNeeded(intent): 该方法用于启动一个Activity,但只有在目标Activity不在前台时才会启动。如果目标Activity已经在前台运行,那么不会重新创建一个新的实例。
startActivityFromChild(child, intent, requestCode): 该方法用于在一个父Activity中启动子Activity。child参数指定要启动子Activity的子视图,requestCode参数用于获取返回结果。
startActivityFromFragment(fragment, intent, requestCode): 该方法用于在一个Fragment中启动一个Activity。fragment参数指定要启动Activity的Fragment,requestCode参数用于获取返回结果。
这些方法提供了不同的灵活性和用途,根据你的需求选择适合的方法来启动另一个Activity。
String scanResult = getIntent().getStringExtra("scan_result")
javapackage com.example.gen_qr_code;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class ScanResultActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan_result);
TextView resultTextView = findViewById(R.id.resultTextView);
String scanResult = getIntent().getStringExtra("scan_result");
resultTextView.setText(scanResult);
TextView result_title = findViewById(R.id.result_title);
result_title.setText("扫描结果:");
}
}
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!