You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:36:00