首页 > 解决方案 > 在 Android 中使用 Google 地图访问用户的当前位置时应用程序崩溃

问题描述

我正在尝试到达用户的当前位置。在运行应用程序时崩溃。该地图正在工作,它指向默认的经纬度,即悉尼,但在尝试访问当前位置时应用程序崩溃。我创建了 enableUserLocation 方法来检查权限。


    class MapsActivity : AppCompatActivity(), OnMapReadyCallback {

        private lateinit var mMap: GoogleMap
        private lateinit var geofencingClient: GeofencingClient
        private var FINE_LOCATION_ACCESS_REQUEST_CODE = 10001

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_maps)
            // Obtain the SupportMapFragment and get notified when the map is ready to be used.
            val mapFragment = supportFragmentManager
                .findFragmentById(R.id.map) as SupportMapFragment
            mapFragment.getMapAsync(this)

            geofencingClient = LocationServices.getGeofencingClient(this)
        }

        /**
         * Manipulates the map once available.
         * This callback is triggered when the map is ready to be used.
         * This is where we can add markers or lines, add listeners or move the camera. In this case,
         * we just add a marker near Sydney, Australia.
         * If Google Play services is not installed on the device, the user will be prompted to install
         * it inside the SupportMapFragment. This method will only be triggered once the user has
         * installed Google Play services and returned to the app.
         */
        override fun onMapReady(googleMap: GoogleMap) {
            mMap = googleMap

            // Add a marker in Sydney and move the camera
            val sydney = LatLng(-34.0, 151.0)
            mMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
            mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))

            enableUserLocation()
        }


        private fun enableUserLocation() {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED
            ) {
                mMap.isMyLocationEnabled = true
            } else {
                //Ask for permission
                if (ActivityCompat.shouldShowRequestPermissionRationale(
                        this,
                        Manifest.permission.ACCESS_FINE_LOCATION
                    )
                ) {
                    //we need to show a user dialog that why the permission is needed and then ask for the permission
                    ActivityCompat.requestPermissions(
                        this,
                        arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
                        FINE_LOCATION_ACCESS_REQUEST_CODE
                    )
                } else {
                    ActivityCompat.requestPermissions(
                        this,
                        arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
                        FINE_LOCATION_ACCESS_REQUEST_CODE
                    )
                }

            }


        }

        override fun onRequestPermissionsResult(
            requestCode: Int,
            permissions: Array<out String>,
            grantResults: IntArray
        ) {
            if (requestCode == FINE_LOCATION_ACCESS_REQUEST_CODE) {
                if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //We have the permission
                    mMap.isMyLocationEnabled = true
                } else {
                    //we do not have the permission

                }
            }

        }
    }

这是 logcat 错误,它说它是运行时异常。


    2020-05-21 14:01:05.064 7621-7628/? E/art: Failed sending reply to debugger: Broken pipe
    2020-05-21 14:01:09.525 7621-7621/com.example.geofencedemo E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.geofencedemo, PID: 7621
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.geofencedemo/com.example.geofencedemo.MapsActivity}: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class fragment
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
            at android.app.ActivityThread.-wrap12(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:154)
            at android.app.ActivityThread.main(ActivityThread.java:6077)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
         Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class fragment
         Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment
         Caused by: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.google.android.gms.maps.SupportMapFragment: calling Fragment constructor caused an exception
            at androidx.fragment.app.Fragment.instantiate(Fragment.java:541)
            at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:57)
            at androidx.fragment.app.FragmentManagerImpl$6.instantiate(FragmentManagerImpl.java:2851)
            at androidx.fragment.app.FragmentManagerImpl.onCreateView(FragmentManagerImpl.java:3196)
            at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:134)
            at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:357)
            at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:336)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:777)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:377)
            at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555)
            at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161)
            at com.example.geofencedemo.MapsActivity.onCreate(MapsActivity.kt:26)
            at android.app.Activity.performCreate(Activity.java:6662)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
            at android.app.ActivityThread.-wrap12(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:154)
            at android.app.ActivityThread.main(ActivityThread.java:6077)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
         Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Constructor.newInstance0(Native Method)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
            at androidx.fragment.app.Fragment.instantiate(Fragment.java:523)
            at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:57) 
            at androidx.fragment.app.FragmentManagerImpl$6.instantiate(FragmentManagerImpl.java:2851) 
            at androidx.fragment.app.FragmentManagerImpl.onCreateView(FragmentManagerImpl.java:3196) 
            at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:134) 
            at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:357) 
            at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:336) 
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:777) 
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:495) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:426) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:377) 
            at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555) 
            at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161) 
            at com.example.geofencedemo.MapsActivity.onCreate(MapsActivity.kt:26) 
            at android.app.Activity.performCreate(Activity.java:6662) 
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
            at android.app.ActivityThread.-wrap12(ActivityThread.java) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:154) 
            at android.app.ActivityThread.main(ActivityThread.java:6077) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 
         Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/maps/SupportMapFragment$zzb;
            at com.google.android.gms.maps.SupportMapFragment.<init>(Unknown Source)
            at java.lang.reflect.Constructor.newInstance0(Native Method) 
            at java.lang.reflect.Constructor.newInstance(Constructor.java:430) 
            at androidx.fragment.app.Fragment.instantiate(Fragment.java:523) 
            at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:57) 
            at androidx.fragment.app.FragmentManagerImpl$6.instantiate(FragmentManagerImpl.java:2851) 
            at androidx.fragment.app.FragmentManagerImpl.onCreateView(FragmentManagerImpl.java:3196) 
            at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:134) 
            at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:357) 
            at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:336) 
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:777) 
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:495) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:426) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:377) 
            at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555) 
            at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161) 
            at com.example.geofencedemo.MapsActivity.onCreate(MapsActivity.kt:26) 
            at android.app.Activity.performCreate(Activity.java:6662) 
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
            at android.app.ActivityThread.-wrap12(ActivityThread.java) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:154) 
            at android.app.ActivityThread.main(ActivityThread.java:6077) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 
         Caused by: java.lang.ClassNotFoundException: com.google.android.gms.maps.SupportMapFragment$zzb
            at java.lang.VMClassLoader.findLoadedClass(Native Method)
    2020-05-21 14:01:09.526 7621-7621/com.example.geofencedemo E/AndroidRuntime:     at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:742)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:362)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
                ... 30 more
         Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/dynamic/zza;
                ... 30 more
         Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.dynamic.zza" on path: DexPathList[[zip file "/data/app/com.example.geofencedemo-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.geofencedemo-2/lib/x86, /system/lib, /vendor/lib]]
            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
                ... 30 more

标签: androidgoogle-mapskotlinandroid-geofence

解决方案


推荐阅读