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

Android中已废弃的onActivityResult与onRequestPermissionsResult方法代码迁移方案咨询

Modernizing Deprecated 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:52:51