0

I have simple method for getting last known location from standard LocationManager:

fun getLastKnownLocation(context: Context): SimpleLocation {
        val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
        val criteria = Criteria()
        criteria.accuracy = Criteria.ACCURACY_FINE
        val location: android.location.Location?
            location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, true))
        if (location == null) {
            return SimpleLocation.create(0.0, 0.0)
        }
        return SimpleLocation.create(location.latitude, location.longitude)
    }

And after that write simple test for it:

class LocationUtilTest {
    private val locationUtil: LocationUtil = spyk()
    private val context = InstrumentationRegistry.getInstrumentation().context


    @Test
    fun getLastKnownLocation() {
         val l = locationUtil.getLastKnownLocation(context)
         assertNotNull(l)
    }
    }

When I run this test, it throws SecurityException:

NOTE!

I replaced my application package name by app_package_name below in stackstace(my test package name is app_package_name.test)

java.lang.SecurityException: invalid package name: **app_package_name**.test
at android.os.Parcel.createException(Parcel.java:1950)
at android.os.Parcel.readException(Parcel.java:1918)
at android.os.Parcel.readException(Parcel.java:1868)
at android.location.ILocationManager$Stub$Proxy.getLastLocation(ILocationManager.java:866)
at android.location.LocationManager.getLastKnownLocation(LocationManager.java:1434)
at com.ziuon.trasher.utils.LocationUtil.getLastKnownLocation(LocationUtil.kt:77)
at java.lang.reflect.Method.invoke(Native Method)
at io.mockk.proxy.android.advice.Advice$SuperMethodCall.call(Advice.kt:135)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:83)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:20)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:28)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:227)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:15)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:42)
at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:53)
at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:263)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:25)
at io.mockk.proxy.android.advice.Advice$handle$1.call(Advice.kt:77)
at com.ziuon.trasher.utils.LocationUtil.getLastKnownLocation(Unknown Source:40)
at com.ziuon.trasher.utils.LocationUtilTest.getLastKnownLocation(LocationUtilTest.kt:55)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:392)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2152)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.LocationManagerService.checkPackageName(LocationManagerService.java:2047)
at com.android.server.LocationManagerService.getLastLocation(LocationManagerService.java:2228)
at android.location.ILocationManager$Stub.onTransact(ILocationManager.java:159)
at android.os.Binder.execTransact(Binder.java:731)

All permissions and uses-feature are indicated in manifest:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-feature android:name="android.hardware.location.gps"
              android:required="false"
/>

Is it throw because I use InstrumentationRegistry.getInstrumentation().context? Or why? Thank you!

NOTE

I figured out this and this. It not helps me.

Marat Zangiev
  • 1,172
  • 7
  • 12

1 Answers1

0

Theres something wrong with your package name or structure. When the JVM tries to load your class, it recognizes its package name as invalid and throw a SecurityException.

For reference see https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html

giovanibr
  • 151
  • 3
  • Thank you for your reply. But I get `SecurityException` only when call `locationManager.getLastKnownLocation` method. Other `LocationManager`-s methods works correctly. – Marat Zangiev Aug 15 '19 at 08:51