如何修复Android MainActivity使用已废弃API的编译警告?
问题根因
你收到的弃用警告是因为代码中调用的startActivityForResult()方法已被AndroidX官方标记为废弃,从Activity 1.2.0、Fragment 1.3.0版本开始,官方推荐使用Activity Result API替代该方法。
修复步骤
1. 替换废弃API
首先删除原有类成员中的static final int REQUEST_IMAGE_CAPTURE常量,新增拍照请求启动器的声明,完整修改后代码如下:
public class MainActivity extends AppCompatActivity { private ActivityResultLauncher<Intent> takePictureLauncher; String currentPhotoPath; Button sendBtn; EditText nameText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nameText = (EditText)findViewById(R.id.editText); sendBtn = (Button)findViewById(R.id.button2); // 初始化拍照启动器,处理拍照返回结果 takePictureLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); // 此处添加拍照成功后的业务逻辑 if (data != null && data.getExtras() != null) { // 默认返回的是拍照缩略图,需要全尺寸可参考后续优化说明 Bitmap imageBitmap = (Bitmap) data.getExtras().get("data"); } } } ); } public void dispatchTakePictureIntent(){ Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { // 替换原有startActivityForResult调用 takePictureLauncher.launch(takePictureIntent); }catch (ActivityNotFoundException e){ // 自定义错误提示逻辑 } } private File createImageFile() throws IOException{ // 创建图片文件 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = " JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File image = File.createTempFile( imageFileName, /* 前缀 */ ".jpg", /* 后缀 */ storageDir /* 存储目录 */ ); // 保存全尺寸图片路径,供后续业务使用 currentPhotoPath = image.getAbsolutePath(); return image; } public void onClick(View view){ dispatchTakePictureIntent(); } public void onClick2(View view) { SqlAdapter sqlAdapter = new SqlAdapter(); try { Connection con = sqlAdapter.connectionclass(); // 原拼接SQL写法存在注入风险,替换为预编译写法 String query = "INSERT INTO dbo.Test(text) VALUES (?)"; PreparedStatement stmt = con.prepareStatement(query); stmt.setString(1, nameText.getText().toString()); stmt.executeUpdate(); } catch (SQLException sqlException){ Log.e("ERROR", sqlException.getMessage()); } } }
2. 可选优化:获取全尺寸拍照结果
你代码中已经实现了createImageFile()方法但未投入使用,当前拍照只能获取低清缩略图,如需全尺寸高清图,可在dispatchTakePictureIntent方法中生成图片文件,将对应Uri通过MediaStore.EXTRA_OUTPUT参数传给拍照Intent即可,注意安卓7.0及以上系统跨应用传递文件需要提前配置FileProvider适配权限限制。
3. 代码安全优化
原有SQL插入逻辑直接拼接用户输入内容,存在SQL注入风险,上述修复代码已经替换为PreparedStatement预编译写法,可完全规避该安全问题。
内容的提问来源于stack exchange,提问作者Seyinator
相关产品推荐
相关产品推荐

