“Augmented reality (AR) is a live direct or indirect view of a physical, real-world environment whose elements are augmented (or supplemented) by computer-generated sensory input such as sound, video, graphics or GPS data. “ from wikipedia.

Wikitude SDK

Wikitude is AR solution SDK which provide image recognition,tracking, location based AR application & much more regarding AR application development. Wikitude SDK is free trail & Pro version available. Wikitude.

Wikitude provide two android SDK solution one is Java Script & another is NATIVE API -
comparison

start with Java Script SDK

  • Download Java Script SDK from Wikitude
  • Create Android application using Android Studio, uses-permission & uses-feature in AndroidManifest.xml

AndroidManifest.xm

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="me.dineshkarpe.hellowikitude"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="19" />
    <uses-permission android:name=
        "android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_GPS" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <uses-feature
        android:name="android.hardware.camera"
        android:required="true" />
    <uses-feature
        android:name="android.hardware.location"
        android:required="true" />
    <uses-feature
        android:name="android.hardware.sensor.accelerometer"
        android:required="true" />
    <uses-feature
        android:name="android.hardware.sensor.compass"
        android:required="true" />
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_action_name"
        android:label="@string/app_name">
        <activity
            android:name="me.dineshkarpe.wikitude.HelloWikitude"
            android:configChanges="screenSize"
            android:icon="@drawable/ic_action_name"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
  • Add wikitude sdk in andriod application
  • Android studio create activity with default layout, in that layout add Wikitude component
package me.dineshkarpe.wikitude;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;

import com.wikitude.architect.ArchitectView;
import com.wikitude.architect.StartupConfiguration;
import java.io.IOException;
import me.dineshkarpe.hellowikitude.R;
/**
 *
 */
public class HelloWikitude extends AppCompatActivity {

	static final String TAG = HelloWikitude.class.getSimpleName();

	private ArchitectView architectView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {


		super.onCreate(savedInstanceState);
		setContentView(R.layout.hellowikitude);

		Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
		setSupportActionBar(toolbar);

		this.architectView = (ArchitectView)this.findViewById(R.id.architectView);
		if(ActivityCompat.checkSelfPermission(HelloWikitude.this,
				Manifest.permission.CAMERA)
				!= PackageManager.PERMISSION_GRANTED){

			if (ActivityCompat.shouldShowRequestPermissionRationale(HelloWikitude.this,
					Manifest.permission.CAMERA)) {

				// Show an expanation to the user *asynchronously* -- don't block
				// this thread waiting for the user's response! After the user
				// sees the explanation, try again to request the permission.

				Log.i(TAG,
						"Displaying camera permission rationale to provide additional context.");
				Snackbar.make(architectView, "Camera permission is needed to show the camera preview.",
						Snackbar.LENGTH_INDEFINITE)
						.setAction("OK", new View.OnClickListener() {
							@Override
							public void onClick(View view) {
								ActivityCompat.requestPermissions(HelloWikitude.this,
										new String[]{Manifest.permission.CAMERA,Manifest.permission.BLUETOOTH},
										0);
							}
						})
						.show();
			} else {

				// No explanation needed, we can request the permission.

				ActivityCompat.requestPermissions(this,
						new String[]{Manifest.permission.CAMERA},
						0);

				// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
				// app-defined int constant. The callback method gets the
				// result of the request.
			}
		}else{
			loadArchitectView();
		}

	}

	@Override
	public void onResume() {

		try{
			super.onResume();

			this.architectView.onResume();

		}catch (NullPointerException e){
		}
	}

	@Override
	protected void onStop() {
		super.onStop();
	}

	@Override
	protected void onDestroy() {

		try{
			super.onDestroy();
		}catch (NullPointerException e){
		}
	}

	@Override
	protected void onPause() {
		try{
			super.onPause();

			this.architectView.onResume();
			this.architectView.onPause();

		}catch (NullPointerException e){

		}
	}

	@Override
	protected void onPostCreate(Bundle savedInstanceState) {
		super.onPostCreate(savedInstanceState);
	}

	@Override
	public void onRequestPermissionsResult(int requestCode,
										   String permissions[], int[] grantResults) {
		switch (requestCode) {
			case 0: {
				// If request is cancelled, the result arrays are empty.
				if (grantResults.length > 0
						&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
					loadArchitectView();

				} else {

					// permission denied, boo! Disable the
					// functionality that depends on this permission.
				}
				return;
			}

			// other 'case' lines to check for other
			// permissions this app might request
		}
	}

	private void loadArchitectView() {

		final StartupConfiguration startupConfiguration = new StartupConfiguration(getApplicationContext().getString(R.string.wikitude_trial_licence_key));
		this.architectView.onCreate(startupConfiguration);

		this.architectView.onPostCreate();
		try {
			this.architectView.load("index.html");
		}catch (IOException e){

		}

		this.architectView.callJavascript("loadLogin()");
		this.architectView.callJavascript("loadWelcome()");
	}
}
  • Now in Main activity initialize
  • Now Override onRequestPermissionsResult() in main Activity.
  • After user provide access camera Wikitude configuration come in the picture
private void loadArchitectView() { 

 final StartupConfiguration startupConfiguration =  new StartupConfiguration(getApplicationContext().getString(R.string.wikitude_trial_licence_key)); 

 this.architectView.onCreate(startupConfiguration); this.architectView.onPostCreate(); 

 try { 
	this.architectView.load("index.html");
 }
 catch (IOException e){ 
 }
 
 this.architectView.callJavascript("loadLogin()");  
 this.architectView.callJavascript("loadWelcome()");
}

How html & java script load with wikitude & android.

  • Create asset folder in android studio project

try { this.architectView.load("index.html"); }catch (IOException e){ }
  • architectView.load() will load file from application’s assets folder and architectView.load(“path/index.html”) the index html-file in path, relative to the assets root directory, no need to use absolute assets-directory.
this.architectView.callJavascript("loadLogin()"); 
this.architectView.callJavascript("loadWelcome()");
  • architectView.callJavascript() will invoke java script function