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

Android Studio文件上传按钮无响应问题求助

问题描述

我开发了一款支持实时拍照或从手机上传图片的分类应用,相机功能运行正常(仅偶尔存在图片旋转问题),拍照后能正常将图片传入模型处理,但上传按钮点击后无任何实际反应——仅能看到按钮被点击的状态,既无报错信息,调试器也没有异常输出。

我刚接触Android Studio,但具备Python开发经验。

已排查内容

  • 权限配置:Manifest文件中已添加读取、管理、写入外部存储权限及ACCESS_WIFI_STATE权限
  • 尝试过重写文件路径
  • 核对过按钮名称拼写

相关代码片段

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Initialize UI elements
    result = findViewById(R.id.result);
    confidence = findViewById(R.id.confidence);
    imageView = findViewById(R.id.imageView);
    picture = findViewById(R.id.button);
    uploadButton = findViewById(R.id.uploadButton);

    // Ensure necessary permissions
    checkAndRequestPermissions();

    // Set listeners for the buttons
    picture.setOnClickListener(view -> {
        if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
            // Launch camera
            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, 1);
        } else {
            // Request camera permission
            requestPermissions(new String[]{Manifest.permission.CAMERA}, 100);
        }
    });

    uploadButton.setOnClickListener(view -> {
        if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            // Open gallery
            Intent pickPhoto = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(pickPhoto, 2);
        } else {
            // Request storage permission
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 101);
        }
    });
}


private void checkAndRequestPermissions() {
    // Check and request camera and external storage permissions
    if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.CAMERA}, 100);
    }

    if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 101);
    }
}
private String saveImageToTemporaryFile(Bitmap image) {
    String filePath = null;
    try {
        File tempFile = File.createTempFile("temp_image", ".jpg", getCacheDir());
        FileOutputStream out = new FileOutputStream(tempFile);
        image.compress(Bitmap.CompressFormat.JPEG, 100, out);
        out.flush();
        out.close();
        filePath = tempFile.getAbsolutePath();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return filePath;
}

private String getRealPathFromURI(Uri uri) {
    String filePath;
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    if (cursor == null) {
        filePath = uri.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        filePath = cursor.getString(idx);
        cursor.close();
    }
    return filePath;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1 && resultCode == RESULT_OK && data != null) {

        Bitmap image = (Bitmap) data.getExtras().get("data");
        String imagePath = saveImageToTemporaryFile(image);
        processImage(image, imagePath);


    } else if (requestCode == 2 && resultCode == RESULT_OK && data != null) {
        // Handle gallery result
        try {
            InputStream imageStream = getContentResolver().openInputStream(data.getData());
            Bitmap image = BitmapFactory.decodeStream(imageStream);
            String imagePath = getRealPathFromURI(data.getData());
            processImage(image, imagePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解决方案

针对上传按钮无响应的问题,结合你的代码和Android版本兼容性问题,可按以下步骤修复:

1. 适配Android 13+的媒体权限

从Android 13(API 33)开始,READ_EXTERNAL_STORAGE权限被废弃,读取图片需使用READ_MEDIA_IMAGES权限:

  • 在Manifest中添加权限:
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    
  • 修改按钮点击逻辑,做版本判断:
    uploadButton.setOnClickListener(view -> {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            if (checkSelfPermission(Manifest.permission.READ_MEDIA_IMAGES) == PackageManager.PERMISSION_GRANTED) {
                openGallery();
            } else {
                requestPermissions(new String[]{Manifest.permission.READ_MEDIA_IMAGES}, 101);
            }
        } else {
            if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                openGallery();
            } else {
                requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 101);
            }
        }
    });
    
    // 抽离打开图库逻辑,避免重复代码
    private void openGallery() {
        Intent pickPhoto = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(pickPhoto, 2);
    }
    

2. 补充权限申请回调逻辑

权限请求是异步操作,用户授权后需手动触发打开图库,重写onRequestPermissionsResult方法:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 101) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            openGallery();
        } else {
            Toast.makeText(this, "需要图片权限才能使用上传功能", Toast.LENGTH_SHORT).show();
        }
    }
}

3. 修复过时路径获取逻辑

Android 10(API 29)后MediaStore.Images.ImageColumns.DATA被废弃,直接获取路径会失效,改用Uri转临时文件的方式:

// 替换原getRealPathFromURI方法,新增Uri转临时文件逻辑
private String saveUriToTempFile(Uri uri) throws IOException {
    File tempFile = File.createTempFile("temp_upload", ".jpg", getCacheDir());
    InputStream in = getContentResolver().openInputStream(uri);
    FileOutputStream out = new FileOutputStream(tempFile);
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
    in.close();
    out.close();
    return tempFile.getAbsolutePath();
}

// 修改onActivityResult中的上传分支
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1 && resultCode == RESULT_OK && data != null) {
        Bitmap image = (Bitmap) data.getExtras().get("data");
        String imagePath = saveImageToTemporaryFile(image);
        processImage(image, imagePath);
    } else if (requestCode == 2 && resultCode == RESULT_OK && data != null) {
        try {
            InputStream imageStream = getContentResolver().openInputStream(data.getData());
            Bitmap image = BitmapFactory.decodeStream(imageStream);
            String imagePath = saveUriToTempFile(data.getData());
            processImage(image, imagePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

内容的提问来源于stack exchange,提问作者Pips 'n Chicks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:25:55