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.

img_compass

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.

Do you want to know how to develop your skillset to become a Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you two of our best selling eBooks for FREE!

JPA Mini Book

Learn how to leverage the power of JPA in order to create robust and flexible Java applications. With this Mini Book, you will get introduced to JPA and smoothly transition to more advanced concepts.

JVM Troubleshooting Guide

The Java virtual machine is really the foundation of any Java EE platform. Learn how to master it with this advanced guide!

Given email address is already subscribed, thank you!
Oops. Something went wrong. Please try again later.
Please provide a valid email address.
Thank you, your sign-up request was successful! Please check your e-mail inbox.
Please complete the CAPTCHA.
Please fill in the required fields.

22 Responses to "Android Compass Code Example"

  1. ArtOne says:

    error in the code
    need to change
    image = (ImageView) findViewById(R.id.main_iv);
    to that
    image = (ImageView) findViewById(R.id.imageViewCompass);

  2. MG says:

    Hi, do you have an .apk file with this example?
    Thanks!

    MG

  3. Md Reza says:

    please update the drive link

  4. Chandu says:

    Nice Dude
    awesome app

  5. omar says:

    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

  6. That’s a really neat little app Mike – thanks.

  7. ragna says:

    Help me plss… Why This…?

    The Application compass (Process android.compas.try) has stopped unexpectedly. please try again.

    T.T

  8. nrj says:

    this app is not working, the image remains static, no motion ever occurs in this app, worst tutorial ever.!!

  9. Luis says:

    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?

  10. zimeun says:

    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.

  11. mithilesh says:

    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 ?

  12. June says:

    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??

  13. Muhammad Babar says:

    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

  14. Muhammad Babar says:

    Why using -degree?

  15. Muhammad Babar says:

    Also i notice imageview.setRotation works better than RotateAnimation as animation producing a lot of gliches

  16. Ben says:

    Thanks! works like a magic !!!! <3

  17. Mahmud says:

    How to get direction of the compass

  18. adeel says:

    sir,

    how to customize that simple compass as qibla compass

Leave a Reply


8 − = seven



Java Code Geeks and all content copyright © 2010-2014, Exelixis Media Ltd | Terms of Use | Privacy Policy | Contact
All trademarks and registered trademarks appearing on Java Code Geeks are the property of their respective owners.
Java is a trademark or registered trademark of Oracle Corporation in the United States and other countries.
Java Code Geeks is not connected to Oracle Corporation and is not sponsored by Oracle Corporation.
Do you want to know how to develop your skillset and become a ...
Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you two of our best selling eBooks for FREE!

Get ready to Rock!
You can download the complementary eBooks using the links below:
Close