VOOZH about

URL: https://www.javacodegeeks.com/2013/09/android-compass-code-example.html

⇱ 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 our best selling eBooks for FREE!
1. JPA Mini Book
2. JVM Troubleshooting Guide
3. JUnit Tutorial for Unit Testing
4. Java Annotations Tutorial
5. Java Interview Questions
6. Spring Interview Questions
7. Android UI Design
and many more ....
I agree to the Terms and Privacy Policy

Thank you!

We will contact you soon.

πŸ‘ Photo of Mike Dalisay
Mike Dalisay
September 6th, 2013Last Updated: November 21st, 2022
33 3,250 2 minutes read
Subscribe

This site uses Akismet to reduce spam. Learn how your comment data is processed.

33 Comments
Oldest
Newest Most Voted
ArtOne
12 years ago

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

3
Reply
12 years ago
Reply to  ArtOne

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

0
Reply
Javier Cifuentes
11 years ago
Reply to  Mike Dalisay

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

0
Reply
MG
12 years ago

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

MG

1
Reply
Md Reza
12 years ago

please update the drive link

0
Reply
12 years ago
Reply to  Md Reza

The download link is updated! Have fun!

0
Reply
Chandu
12 years ago

Nice Dude
awesome app

0
Reply
omar
12 years ago

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

0
Reply
12 years ago

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

0
Reply
ragna
12 years ago

Help me plss… Why This…?

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

T.T

0
Reply
nrj
12 years ago

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

0
Reply
Akhilesh
11 years ago
Reply to  nrj

The mobile in which you are running this might not have the gryo or comapss sensor

0
Reply
Luis
12 years ago

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?

0
Reply
12 years ago

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.

0
Reply
mithilesh
11 years ago

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 ?

0
Reply
Maulik Patel
11 years ago
Reply to  mithilesh

plss check with your device
its has magnetic sensor or not?

0
Reply
June
11 years ago

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

0
Reply
Muhammad Babar
11 years ago

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

0
Reply
Muhammad Babar
11 years ago

Why using -degree?

0
Reply
Muhammad Babar
11 years ago

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

0
Reply
Ben
11 years ago

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

0
Reply
Mahmud
11 years ago

How to get direction of the compass

0
Reply
adeel
11 years ago

sir,

how to customize that simple compass as qibla compass

0
Reply
Meenu
11 years ago

its not working on my tablet z1000 zync. The image is not rotating! I don’t know why?!

1
Reply
Anil
11 years ago

Image is moving along with the mobile orientation as it wants . but its not showing the correct direction as in compass..

0
Reply
Back to top button
Close
wpDiscuz