如何从图库上传和保存图像。startActivityForResult 已弃用

0 java android firebase firebase-storage

我目前正在学习如何在 java 中使用 android studio,并尝试制作一个社交媒体应用程序。我目前正在创建一个编辑个人资料页面,用户可以在其中更新其详细信息并上传个人资料图片。

我一直在关注在线教程,我遇到的所有教程都使用 startActivityForResult 方法。它已被划掉,并且不会调用该方法,因为它已被弃用。但我不知道该用什么来代替。

`ProfileImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //open gallery

            Intent OpenGalleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(OpenGalleryIntent, 1000);
        }
    });
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @androidx.annotation.Nullable Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 1000){
        if(resultCode == Activity.RESULT_OK){
            Uri imageUri = data.getData();
            ProfileImage.setImageURI(imageUri);
            UploadImageToFirebase(imageUri);
        }
    }
}
private void UploadImageToFirebase(Uri image){
    StorageReference fileRef = storageReference.child("Profile.jpg");
    fileRef.putFile(image).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            Toast.makeText(Edit_Profile.this, "Image Uploaded", Toast.LENGTH_SHORT).show();
        }
    });![enter image description here](https://i.stack.imgur.com/padRc.jpg)`
Run Code Online (Sandbox Code Playgroud)

我知道有另一种选择,但我不明白它是如何工作的。

Myr*_*lav 6

startActivityForResult在 AndroidX Activity 和 Fragment API 的更高版本中确实已弃用(尽管我相信尽管有警告您仍然可以使用它)。从活动中获取结果的新方法是registerForActivityResult

在您的代码中,您需要创建一个启动器,它将处理结果(选定的图像)

private final ActivityResultLauncher<Intent> launcher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == Activity.RESULT_OK 
                       && result.getData() != null) {
                    Uri photoUri = result.getData().getData();
                    //use photoUri here
                }
            }
    );

Run Code Online (Sandbox Code Playgroud)

然后在 onClickListener 中启动这个启动器

profileImage.setOnClickListener(view -> {
            Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            launcher.launch(intent);
        });
Run Code Online (Sandbox Code Playgroud)