Augmented Reality In Android
Posted By : Aman Srivastava | 07-Jan-2021
Arcore is the android SDK to use augmented reality within android mobile applications.ARCore SDKs make AR features available on ARCore supported devices that have Google Play Services for AR (ARCore) installed.
To enable ArCore you need to perform the following steps :
- Add Ar entries to the manifest file.
- Add dependencies to build.gradle.
- Implementation.
Add To Manifest -
You need to add the following permission and metadata to your AndroidManifest.xml file for ARCore configuration in your application:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature
android:name="android.hardware.camera.ar"
android:required="true" />
And inside application tag -
<meta-data
android:name="com.google.ar.core"
android:value="required" />
Also Read: Unlocking the potential of Immersive VR using Unity
Add Dependencies
In the project's build.Gradle :
classpath 'com.google.ar.sceneform:plugin:1.0.1'
In app's build.Gradle :
implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.0.0'
In app's Gradle file :
apply plugin: 'com.google.ar.sceneform.plugin'
Implementation
- Add models(OBJ and GLTX extension) into project :
3D models to render must have either .obj or .gltx extension, you can download the sample models from https://poly.google.com/
Create sampledata directory in your project and add .obj and .mtl downloaded files.
Then right-click on the obj file and choose import as sceneform assets.
As a result, the Renderable AR sceneform assets gets automatically created. Also the following lines at the end of the app’s build.gradle will be automatically added:
sceneform.asset('sampledata/Coffee Cup_final.obj',
'default',
'sampledata/Coffee Cup_final.sfa',
'src/main/assets/Coffee Cup_final')
- Add ArFragment into your XML file :
<fragment android:id="@+id/sceneForm" android:name="com.google.ar.sceneform.ux.ArFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
- Initialize ArFragment into MainActivity.java file :
arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.sceneForm);
- Create a method addObject() to get hit points on the plane using motion tracking :
private void addObject(Uri model) {
Frame frame = fragment.getArSceneView().getArFrame();
android.graphics.Point pt = getScreenCenter();
List<HitResult> hits;
if (frame != null) {
hits = frame.hitTest(pt.x, pt.y);
for (HitResult hit : hits) {
Trackable trackable = hit.getTrackable();
if (trackable instanceof Plane &&
((Plane) trackable).isPoseInPolygon(hit.getHitPose())) {
modelLoader.loadModel(hit.createAnchor(), model);
break;
}
}
}
}
The call of addObject() will be from the onCreate method with Uri of the model as a param :
addObject(Uri.parse("Mesh_Zebra.sfb"));
- Now once the plane is detected we need to load the model, so let's create the class ModelLoader with a method loadModel() inside it :
public class ModelLoader {
private final WeakReference<MainActivity> owner;
private static final String TAG = "ModelLoader";
ModelLoader(WeakReference<MainActivity> owner) {
this.owner = owner;
}
void loadModel(Anchor anchor, Uri uri) {
if (owner.get() == null) {
Log.d(TAG, "Activity is null. Cannot load model.");
return;
}
ModelRenderable.builder()
.setSource(owner.get(), uri)
.build()
.handle((renderable, throwable) -> {
MainActivity activity = owner.get();
if (activity == null) {
return null;
} else if (throwable != null) {
activity.onException(throwable);
} else {
activity.addNodeToScene(anchor, renderable);
}
return null;
});
return;
}
}
- Now as soon as the model is loaded we need to place the model to the scene, so let's make a method for that :
public void addNodeToScene(Anchor anchor, ModelRenderable renderable) {
AnchorNode anchorNode = new AnchorNode(anchor);
TransformableNode node = new TransformableNode(fragment.getTransformationSystem());
node.setRenderable(renderable);
node.setParent(anchorNode);
fragment.getArSceneView().getScene().addChild(anchorNode);
node.select();
}
Conclusion
You will find your 3D model loaded on your screen as soon as the scene is detected.
Note: Make sure to use the latest version of sceneform package in your project.
Also Read: Understanding The Lifecycle of Custom View In Android
Choose Oodles For AR App Development
We are a seasoned AR VR app development company that specializes in building high-quality virtual reality apps that deliver immersive user experiences. Our development team uses advanced frameworks and tools like Unity, Vuforia, Argon.js, and React VR to build high-graphics VR apps that maximize user engagement. Explore our augmented reality app development services here. For more information, contact us at [email protected].
Cookies are important to the proper functioning of a site. To improve your experience, we use cookies to remember log-in details and provide secure log-in, collect statistics to optimize site functionality, and deliver content tailored to your interests. Click Agree and Proceed to accept cookies and go directly to the site or click on View Cookie Settings to see detailed descriptions of the types of cookies and choose whether to accept certain cookies while on the site.
About Author
Aman Srivastava
Aman is a passionate Mobile Application Developer, who likes to explore and implement new technologies.