Android中已废弃的onActivityResult与onRequestPermissionsResult方法代码迁移方案咨询
onActivityResult & Permission Handling Hey there! Let's update your code to use Android's Activity Result Contracts API—the official replacement for both deprecated onActivityResult() and the old permission request flow. Here's a step-by-step conversion:
1. Define Activity Result Launchers
First, replace your deprecated callbacks with registered launchers in your Activity/Fragment. These launchers handle both permission requests and activity results cleanly:
import androidx.activity.result.contract.ActivityResultContracts import android.Manifest import android.content.pm.PackageManager import android.app.Activity // Inside your Activity/Fragment class private val requestLocationPermissionsLauncher = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissionsMap -> // Map the result to your existing permission handling logic val fineLocationGranted = permissionsMap.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false ) val coarseLocationGranted = permissionsMap.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION, false ) // Pass results to your existing method (matches your original logic) onRequestPermissionsResult( Consts.LocationService.REQUEST_LOCATION, intArrayOf( if (fineLocationGranted) PackageManager.PERMISSION_GRANTED else PackageManager.PERMISSION_DENIED, if (coarseLocationGranted) PackageManager.PERMISSION_GRANTED else PackageManager.PERMISSION_DENIED ) ) } private val locationActivityResultLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> // Optional: Handle result code if needed (e.g., success/cancellation) // if (result.resultCode == Activity.RESULT_OK) { ... } // Forward to your locationHelper as before locationHelper.onActivityResult(Consts.LocationService.REQUEST_LOCATION) }
2. Replace Old Request Calls
Update wherever you originally requested permissions or started the location-related activity:
For Permission Requests
Instead of calling requestPermissions(...), use the permission launcher:
// Trigger location permission request requestLocationPermissionsLauncher.launch( arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ) )
For Starting the Location Activity
Instead of startActivityForResult(intent, REQUEST_LOCATION), use the activity result launcher:
// Launch your location-related activity (replace 'intent' with your actual Intent object) locationActivityResultLauncher.launch(intent)
3. Remove Deprecated Methods
You can now delete these overridden methods entirely—they're no longer needed:
// DELETE THESE ENTIRELY: override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { ... } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { ... }
Key Notes
- Lifecycle Safety: Always register launchers in
onCreate()(or earlier) to avoid lifecycle mismatch errors. - Modularity: Each launcher handles one specific task, making your code easier to maintain and test.
- Pre-built Contracts: The API includes ready-to-use contracts for common tasks like camera access, gallery selection, and permissions—no need to write custom result logic from scratch.
内容的提问来源于stack exchange,提问作者RockyGlobal

