我有一个 Ar 对象,它放置在屏幕底部,并且会随着相机的移动而移动,但一段时间后会出现错误,说明 E/ARCore-LocationProvider:FLP api 客户端构建期间出现异常:com.google.android.gms.common.api.GoogleApiClient java.lang.ClassNotFoundException:com.google.android.gms.common.api.GoogleApiClient
我不知道为什么会出现这种情况,因为我没有使用任何基于位置的服务
这是完整的错误:
E/ARCore-LocationProvider: Exception during FLP api client construction: com.google.android.gms.common.api.GoogleApiClient
java.lang.ClassNotFoundException: com.google.android.gms.common.api.GoogleApiClient
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:454)
at com.google.ar.core.services.LocationProvider.loadClass(PG:74)
at com.google.ar.core.services.LocationProvider.<init>(PG:11)
at com.google.ar.core.Session.nativeCreateSessionAndWrapperWithFeatures(Native Method)
at com.google.ar.core.Session.<init>(Session.java:14)
at com.google.ar.sceneform.ux.BaseArFragment.createSessionWithFeatures(BaseArFragment.java:419)
at com.google.ar.sceneform.ux.BaseArFragment.createSession(BaseArFragment.java:405)
at com.google.ar.sceneform.ux.BaseArFragment.initializeSession(BaseArFragment.java:379)
at com.google.ar.sceneform.ux.BaseArFragment.onResume(BaseArFragment.java:338)
at androidx.fragment.app.Fragment.performResume(Fragment.java:2498)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1501)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3269)
at androidx.fragment.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:3241)
at androidx.fragment.app.FragmentController.dispatchResume(FragmentController.java:223)
at androidx.fragment.app.FragmentActivity.onResumeFragments(FragmentActivity.java:538)
at androidx.fragment.app.FragmentActivity.onPostResume(FragmentActivity.java:527)
at androidx.appcompat.app.AppCompatActivity.onPostResume(AppCompatActivity.java:172)
at android.app.Activity.performResume(Activity.java:7977)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4312)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4354)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2109)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.common.api.GoogleApiClient" on path: DexPathList[[zip file "/data/app/com.example.arrings-Z2Bc9Z5oOudX5Z9PhFYHZQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.arrings-Z2Bc9Z5oOudX5Z9PhFYHZQ==/lib/arm64, /data/app/com.example.arrings-Z2Bc9Z5oOudX5Z9PhFYHZQ==/base.apk!/lib/arm64-v8a, /system/lib64, /system/product/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:454)
at com.google.ar.core.services.LocationProvider.loadClass(PG:74)
at com.google.ar.core.services.LocationProvider.<init>(PG:11)
at com.google.ar.core.Session.nativeCreateSessionAndWrapperWithFeatures(Native Method)
at com.google.ar.core.Session.<init>(Session.java:14)
at com.google.ar.sceneform.ux.BaseArFragment.createSessionWithFeatures(BaseArFragment.java:419)
at com.google.ar.sceneform.ux.BaseArFragment.createSession(BaseArFragment.java:405)
at com.google.ar.sceneform.ux.BaseArFragment.initializeSession(BaseArFragment.java:379)
at com.google.ar.sceneform.ux.BaseArFragment.onResume(BaseArFragment.java:338)
at androidx.fragment.app.Fragment.performResume(Fragment.java:2498)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1501)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3269)
at androidx.fragment.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:3241)
at androidx.fragment.app.FragmentController.dispatchResume(FragmentController.java:223)
at androidx.fragment.app.FragmentActivity.onResumeFragments(FragmentActivity.java:538)
at androidx.fragment.app.FragmentActivity.onPostResume(FragmentActivity.java:527)
at androidx.appcompat.app.AppCompatActivity.onPostResume(AppCompatActivity.java:172)
at android.app.Activity.performResume(Activity.java:7977)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4312)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4354)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2109)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
2020-05-11 12:04:39.708 7568-7568/com.example.arrings E/ARCore-LocationProvider: Can't find FLP class: com.google.android.gms.location.LocationServices
java.lang.ClassNotFoundException: com.google.android.gms.location.LocationServices
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:454)
at com.google.ar.core.services.LocationProvider.loadClass(PG:74)
at com.google.ar.core.services.LocationProvider.isLocationLibraryLinked(PG:60)
at com.google.ar.core.Session.nativeCreateSessionAndWrapperWithFeatures(Native Method)
at com.google.ar.core.Session.<init>(Session.java:14)
at com.google.ar.sceneform.ux.BaseArFragment.createSessionWithFeatures(BaseArFragment.java:419)
at com.google.ar.sceneform.ux.BaseArFragment.createSession(BaseArFragment.java:405)
at com.google.ar.sceneform.ux.BaseArFragment.initializeSession(BaseArFragment.java:379)
at com.google.ar.sceneform.ux.BaseArFragment.onResume(BaseArFragment.java:338)
at androidx.fragment.app.Fragment.performResume(Fragment.java:2498)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1501)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3269)
at androidx.fragment.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:3241)
at androidx.fragment.app.FragmentController.dispatchResume(FragmentController.java:223)
at androidx.fragment.app.FragmentActivity.onResumeFragments(FragmentActivity.java:538)
at androidx.fragment.app.FragmentActivity.onPostResume(FragmentActivity.java:527)
at androidx.appcompat.app.AppCompatActivity.onPostResume(AppCompatActivity.java:172)
at android.app.Activity.performResume(Activity.java:7977)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4312)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4354)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2109)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.location.LocationServices" on path: DexPathList[[zip file "/data/app/com.example.arrings-Z2Bc9Z5oOudX5Z9PhFYHZQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.arrings-Z2Bc9Z5oOudX5Z9PhFYHZQ==/lib/arm64, /data/app/com.example.arrings-Z2Bc9Z5oOudX5Z9PhFYHZQ==/base.apk!/lib/arm64-v8a, /system/lib64, /system/product/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:454)
at com.google.ar.core.services.LocationProvider.loadClass(PG:74)
at com.google.ar.core.services.LocationProvider.isLocationLibraryLinked(PG:60)
at com.google.ar.core.Session.nativeCreateSessionAndWrapperWithFeatures(Native Method)
at com.google.ar.core.Session.<init>(Session.java:14)
at com.google.ar.sceneform.ux.BaseArFragment.createSessionWithFeatures(BaseArFragment.java:419)
at com.google.ar.sceneform.ux.BaseArFragment.createSession(BaseArFragment.java:405)
at com.google.ar.sceneform.ux.BaseArFragment.initializeSession(BaseArFragment.java:379)
at com.google.ar.sceneform.ux.BaseArFragment.onResume(BaseArFragment.java:338)
at androidx.fragment.app.Fragment.performResume(Fragment.java:2498)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1501)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3269)
at androidx.fragment.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:3241)
at androidx.fragment.app.FragmentController.dispatchResume(FragmentController.java:223)
at androidx.fragment.app.FragmentActivity.onResumeFragments(FragmentActivity.java:538)
at androidx.fragment.app.FragmentActivity.onPostResume(FragmentActivity.java:527)
at androidx.appcompat.app.AppCompatActivity.onPostResume(AppCompatActivity.java:172)
at android.app.Activity.performResume(Activity.java:7977)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4312)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4354)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2109)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
2020
这件事也是在崩溃之前发生的
camera_image_stream.cc:230 Camera Image Stream failed to dequeue Image from ImageReader. status=UNAVAILABLE: AImageReader_acquireLatestImage [type.googleapis.com/util.ErrorSpacePayload='ImageReaderStatusErrorSpaceClass::AMEDIA_IMGREADER_NO_BUFFER_AVAILABLE'] acquired_image_count=9
2020-05-11 12:05:12.837 7568-7678/com.example.arrings E/native: camera_image_stream.cc:230 Camera Image Stream failed to dequeue Image from ImageReader. status=UNAVAILABLE: AImageReader_acquireLatestImage [type.googleapis.com/util.ErrorSpacePayload='ImageReaderStatusErrorSpaceClass::AMEDIA_IMGREADER_NO_BUFFER_AVAILABLE'] acquired_image_count=9
2020-05-11 12:05:12.837 7568-7678/com.example.arrings E/native: camera_image_stream.cc:230 Camera Image Stream failed to dequeue Image from ImageReader. status=UNAVAILABLE: AImageReader_acquireLatestImage [type.googleapis.com/util.ErrorSpacePayload='ImageReaderStatusErrorSpaceClass::AMEDIA_IMGREADER_NO_BUFFER_AVAILABLE'] acquired_image_count=9
这是我正在使用的代码:\
private lateinit var arFragment: ArFragment
private var renderable: ModelRenderable? = null
private val mCameraRelativePose = Pose.makeTranslation(0.0f, -0.39f, -0.55f)
private var oldAnchor: Anchor? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
arFragment = ar_fragment as ArFragment
arFragment.planeDiscoveryController.hide()
arFragment.arSceneView.planeRenderer.isVisible = false
arFragment.planeDiscoveryController.setInstructionView(null)
arFragment.arSceneView.scene.addOnUpdateListener { frameTime ->
arFragment.onUpdate(frameTime)
addNodeToScene()
}
//arFragment.setOnTapArPlaneListener { _, _, _ -> }
placeObject()
}
/**
* @param fragment our fragment
* @param anchor ARCore anchor from the hit test
* @param model our 3D model of choice
*
* Uses the ARCore anchor from the hitTest result and builds the Sceneform nodes.
* It starts the asynchronous loading of the 3D model using the ModelRenderable builder.
*/
private fun placeObject() {
ModelRenderable.builder()
.setSource(arFragment.context, R.raw.rings)
.build()
.thenAccept {
renderable?.isShadowCaster = false
renderable?.isShadowReceiver = false
renderable = it
}
.exceptionally {
Toast.makeText(this@MainActivity, "Error", Toast.LENGTH_SHORT).show()
return@exceptionally null
}
}
/**
* @param fragment our fragment
* @param anchor ARCore anchor
* @param renderable our model created as a Sceneform Renderable
*
* This method builds two nodes and attaches them to our scene
* The Anchor nodes is positioned based on the pose of an ARCore Anchor. They stay positioned in the sample place relative to the real world.
* The Transformable node is our Model
* Once the nodes are connected we select the TransformableNode so it is available for interactions
*/
private fun addNodeToScene() {
val frame = arFragment.arSceneView.arFrame ?: return
val pose =
frame.camera?.displayOrientedPose?.compose(mCameraRelativePose)?.extractTranslation()
if (frame.camera?.trackingState == TrackingState.TRACKING) {
val anchor = arFragment.arSceneView.session?.createAnchor(pose)
anchor?.pose?.toMatrix(FloatArray(16), 0)
if (oldAnchor != null) {
oldAnchor?.detach()
}
oldAnchor = anchor
val anchorNode = AnchorNode(anchor)
anchorNode.isSmoothed = true
anchorNode.setParent(arFragment.arSceneView.scene)
// TransformableNode means the user to move, scale and rotate the model
val transformableNode = TransformableNode(arFragment.transformationSystem)
transformableNode.renderable = renderable // have to add position and angel here naaa
transformableNode.setParent(anchorNode)
transformableNode.select()
}
}
我对 LocationProvider 也有类似的问题,并且我没有在我的应用程序中使用位置。在将图像添加到增强图像数据库时,我不小心使用了空名称。
AugmentedImageDatabase augmentedImageDatabase = new AugmentedImageDatabase(session);
augmentedImageDatabase.addImage(name /*was null*/, bitmap, size);
今天使用ARCore 1.46.0配合Sceneform 1.17.1,上述问题不再存在。我运行了稍微调整过的代码(我使用青色球体基元而不是 3D 模型)并确保应用程序不会产生上述错误。必须承认,三四年前,这样的错误确实发生过。所以谷歌工程师修复了它。
class MainActivity : AppCompatActivity() {
private lateinit var arFragment: ArFragment
private var renderable: ModelRenderable? = null
private val relativePose = Pose.makeTranslation(0.0f,-0.4f,-1.5f)
private var oldAnchor: Anchor? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
val fragment = supportFragmentManager.findFragmentByTag("frag")
this.arFragment = fragment as ArFragment
arFragment.arSceneView.planeRenderer.isVisible = false
arFragment.planeDiscoveryController.hide()
arFragment.planeDiscoveryController.setInstructionView(null)
arFragment.arSceneView.scene.addOnUpdateListener {
arFragment.onUpdate(it)
addNodeToScene(arFragment)
}
placeObject(arFragment)
}
private fun placeObject(fragment: ArFragment) {
MaterialFactory.makeOpaqueWithColor(
fragment.context,
Color(0f, 1f, 1f)
).thenAccept {
val sphere = ShapeFactory.makeSphere(0.19f, Vector3.zero(), it)
renderable = sphere
renderable?.isShadowCaster = false
renderable?.isShadowReceiver = false
Toast.makeText(
this@MainActivity, "Everything is fine", Toast.LENGTH_SHORT
).show()
}.exceptionally {
Toast.makeText(
this@MainActivity, "Error", Toast.LENGTH_SHORT
).show()
return@exceptionally null
}
}
private fun addNodeToScene(fragment: ArFragment) {
val frame = fragment.arSceneView.arFrame ?: return
val pose = frame.camera.displayOrientedPose?.compose(relativePose)?.extractTranslation()
if (frame.camera.trackingState == TrackingState.TRACKING) {
val anchor = fragment.arSceneView.session?.createAnchor(pose)
anchor?.pose?.toMatrix(FloatArray(16), 0)
if (oldAnchor != null) {
oldAnchor?.detach()
}
oldAnchor = anchor
val anchorNode = AnchorNode(anchor)
anchorNode.setParent(fragment.arSceneView.scene)
anchorNode.isSmoothed = true
val modelNode = TransformableNode(fragment.transformationSystem)
modelNode.renderable = renderable
modelNode.setParent(anchorNode)
modelNode.select()
}
}
}