Android Core
Android Compass Code Example
Today I’m going to share a working code to make a very simple compass application for your android device.
Some android device (like Huawei Y300 and Lenovo P700i) does not have full support of motions sensors so this code will not work for them.
Video Demo
Our code for today will run just like this:
Files Needed
You need to create your own compass image. For this example, I’m using a stock photo. Your image must be a PNG with transparent background, do not use this jpg file I used.
Let’s Code
Here’s our MainActivity.java
package com.example.compassapp; import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.ImageView; import android.widget.TextView; public class MainActivity extends Activity implements SensorEventListener { // define the display assembly compass picture private ImageView image; // record the compass picture angle turned private float currentDegree = 0f; // device sensor manager private SensorManager mSensorManager; TextView tvHeading; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // image = (ImageView) findViewById(R.id.main_iv); // TextView that will tell the user what degree is he heading tvHeading = (TextView) findViewById(R.id.tvHeading); // initialize your android device sensor capabilities mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); } @Override protected void onResume() { super.onResume(); // for the system's orientation sensor registered listeners mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME); } @Override protected void onPause() { super.onPause(); // to stop the listener and save battery mSensorManager.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent event) { // get the angle around the z-axis rotated float degree = Math.round(event.values[0]); tvHeading.setText("Heading: " + Float.toString(degree) + " degrees"); // create a rotation animation (reverse turn degree degrees) RotateAnimation ra = new RotateAnimation( currentDegree, -degree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); // how long the animation will take place ra.setDuration(210); // set the animation after the end of the reservation status ra.setFillAfter(true); // Start the animation image.startAnimation(ra); currentDegree = -degree; } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // not in use } }
Our layout file activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff" > <TextView android:id="@+id/tvHeading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginBottom="40dp" android:layout_marginTop="20dp" android:text="Heading: 0.0" /> <ImageView android:id="@+id/imageViewCompass" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tvHeading" android:layout_centerHorizontal="true" android:src="@drawable/img_compass" /> </RelativeLayout>
Source Code Download
You can download this sample project here: CompassApp.zip
Some notes
My app orientation is locked to portrait mode. There are no special permissions in the Manifest file.
Further Readings
Reference: Android Compass Code Example from our JCG partner Mike Dalisay at the The Code of a Ninja blog.
error in the code
need to change
image = (ImageView) findViewById(R.id.main_iv);
to that
image = (ImageView) findViewById(R.id.imageViewCompass);
Hi @ArtOne, thanks for the catch, it was fixed and updated in my original post http://www.codeofaninja.com/2013/08/android-compass-code-example.html
Hi Mike
This is late reply but I am looking for someone that can build a special compass for me.
The compass must be white, no marks, a round circle on the outside and a car drawn
at a given angle, that is placed over the circle. The angle is the real angle between the cell and the car
so when the compass points north the car will signal the direction of the car
Can you develop this?
rgds
Hi, do you have an .apk file with this example?
Thanks!
MG
please update the drive link
The download link is updated! Have fun!
Nice Dude
awesome app
hello Mike Dalisay
good work. I would like to ask you if you like to work with me in android projects and I can pay a money to you for each project… please contact me . thank
That’s a really neat little app Mike – thanks.
Help me plss… Why This…?
The Application compass (Process android.compas.try) has stopped unexpectedly. please try again.
T.T
this app is not working, the image remains static, no motion ever occurs in this app, worst tutorial ever.!!
The mobile in which you are running this might not have the gryo or comapss sensor
The first time the image point different places in each launch, so it depends on the device position where the image point to the “north”. isn’t it?
How can you fix it?
Hi I want to see your source code for compass application but there is no reply mail from your website! Ive done subscribing my email address but no reply so I couldn’t download your application..:( plz give me the answer Thanks.
I have run this app in device but image is not move value is also not change. it is 0.0. Please solve this issues ?
plss check with your device
its has magnetic sensor or not?
Thank you for your tutorial, Mike!
I’m trying to customize your code and have one question.
Is there any way to blend compass image and background image with Multiply-like blending mode??
Hi,
Nice use of Rotation Animation. What i can see the following code will work for “Horizontal axis” not for “Vertical”.
Am i right!
Thanks for sharing the code.
Regards
Muhammad Babar
Why using -degree?
Also i notice imageview.setRotation works better than RotateAnimation as animation producing a lot of gliches
Thanks! works like a magic !!!! <3
How to get direction of the compass
sir,
how to customize that simple compass as qibla compass
its not working on my tablet z1000 zync. The image is not rotating! I don’t know why?!
Image is moving along with the mobile orientation as it wants . but its not showing the correct direction as in compass..