App works in emulator but crashes in real device
<p>I have an app that shows user's current location on google map, the app runs in emulator (though it doesn't show location) however it crashes in real device.
Here is the error I'm getting</p>

<blockquote>
  <p>01-04 15:00:59.509 26494-26494/io.xgear.geotag E/AndroidRuntime: FATAL
  EXCEPTION: main java.lang.RuntimeException: Unable to start activity
  ComponentInfo{io.xgear.geotag/io.xgear.geotag.MainActivity}:
  java.lang.NullPointerException</p>
  
  <p>at
  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)</p>
  
  <p>at
  android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)</p>
  
  <p>at android.app.ActivityThread.access$1500(ActivityThread.java:121)</p>
  
  <p>at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)</p>
  
  <p>at android.os.Handler.dispatchMessage(Handler.java:99)</p>
  
  <p>at android.os.Looper.loop(Looper.java:130)</p>
  
  <p>at android.app.ActivityThread.main(ActivityThread.java:3701)</p>
  
  <p>at java.lang.reflect.Method.invokeNative(Native Method)</p>
  
  <p>at java.lang.reflect.Method.invoke(Method.java:507)</p>
  
  <p>at
  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)</p>
  
  <p>at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)</p>
  
  <p>at dalvik.system.NativeStart.main(Native Method)</p>
  
  <p>Caused by: java.lang.NullPointerException</p>
  
  <p>at io.xgear.geotag.MainActivity.onCreate(MainActivity.java:72)</p>
  
  <p>at
  android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)</p>
  
  <p>at
  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)</p>
  
  <p>at
  android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675) </p>
  
  <p>at android.app.ActivityThread.access$1500(ActivityThread.java:121) </p>
  
  <p>at
  android.app.ActivityThread$H.handleMessage(ActivityThread.java:943) </p>
  
  <p>at android.os.Handler.dispatchMessage(Handler.java:99) </p>
  
  <p>at android.os.Looper.loop(Looper.java:130) </p>
  
  <p>at android.app.ActivityThread.main(ActivityThread.java:3701) </p>
  
  <p>at java.lang.reflect.Method.invokeNative(Native Method) </p>
  
  <p>at java.lang.reflect.Method.invoke(Method.java:507) </p>
  
  <p>at
  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)</p>
  
  <p>at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) </p>
  
  <p>at dalvik.system.NativeStart.main(Native Method)</p>
</blockquote>

<p> </p>

<p>and here's my code for main activity</p>

<pre><code>package io.xgear.geotag;


import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.widget.TextView;
import android.support.v4.app.Fragment;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.TargetApi;
import android.content.ContentValues;
import android.os.AsyncTask;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.InputType;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;

import io.xgear.geotag.helper.Post;

public class MainActivity extends FragmentActivity implements LocationListener {
    GoogleMap googleMap;
    private GeoTagTask mAuthTask = null;
    //GPSTracker gps;
    private JSONObject jsonObj;

    // UI references.
    private EditText txtShopCode;
    private EditText lblAddress;
    private View mProgressView;
    private View mGeoTagForm;
    private Button btnGeoTag;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       // setContentView(R.layout.activity_main);

        txtShopCode = (EditText) findViewById(R.id.txtShopCode);
        btnGeoTag = (Button) findViewById(R.id.btnGeoTag);
        mGeoTagForm = (View) findViewById(R.id.geoTagForm);
        mProgressView = findViewById(R.id.geoTagProgress);
        if (!isGooglePlayServicesAvailable()) {
            finish();
        }
        setContentView(R.layout.activity_main);
        SupportMapFragment supportMapFragment =
                (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.googleMap);
        googleMap = supportMapFragment.getMap();
        googleMap.setMyLocationEnabled(true);
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        String bestProvider = locationManager.getBestProvider(criteria, true);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &amp;&amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        Location location = locationManager.getLastKnownLocation(bestProvider);
        if (location != null) {
            onLocationChanged(location);
        }
        locationManager.requestLocationUpdates(bestProvider, 20000, 0, this);

       // gps = new GPSTracker(MainActivity.this);
        btnGeoTag.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                String shopid = txtShopCode.getText().toString();
                boolean cancel = false;
                View focusView = null;

               //txtShopCode.setInputType(InputType.TYPE_CLASS_NUMBER);

                if (TextUtils.isEmpty(shopid)) {
                    txtShopCode.setError(getString(R.string.error_field_required));
                    focusView = txtShopCode;
                    cancel = true;

                }
                else {


                    showProgress(true);
                    mAuthTask = new GeoTagTask(shopid);
                    mAuthTask.execute((Void) null);
                }
            }

        });

    }


//
//    public void btnGeoTag_Click(View v){
//
//    }
    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
    public void showProgress(final boolean show) {
        // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
        // for very easy animations. If available, use these APIs to fade-in
        // the progress spinner.
        if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.HONEYCOMB_MR2) {
            int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime);

            mGeoTagForm.setVisibility(show ? View.GONE : View.VISIBLE);
            mGeoTagForm.animate().setDuration(shortAnimTime).alpha(
                    show ? 0 : 1).setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    mGeoTagForm.setVisibility(show ? View.GONE : View.VISIBLE);
                }
            });

            mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
            mProgressView.animate().setDuration(shortAnimTime).alpha(
                    show ? 1 : 0).setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
                }
            });
        } else {
            // The ViewPropertyAnimator APIs are not available, so simply show
            // and hide the relevant UI components.
            mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
            mGeoTagForm.setVisibility(show ? View.GONE : View.VISIBLE);
        }
    }

    public class GeoTagTask extends AsyncTask&lt;Void, Void, Boolean&gt; {
        private final String shopCode;
       // private String lat= Double.toString( gps.getLatitude());
      //  private String lng = Double.toString( gps.getLongitude());
       Location location;
        private String lat = Double.toString(location.getLatitude());
        private String lng = Double.toString(location.getLongitude());
       // double longitude = location.getLongitude();
        private boolean isConnect;
        GeoTagTask(String shopId) {
            shopCode = shopId;
            isConnect = false;
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            boolean res = false;
     try {
                ContentValues nameValuePairs = new ContentValues();
                nameValuePairs.put("Id", shopCode);
                nameValuePairs.put("lat", lat);
                nameValuePairs.put("lng", lng);
         //Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + lat + "\nLong: " + lng, Toast.LENGTH_LONG).show();
               Log.i("Latitude", lat+"");

                Post post = new Post(getApplicationContext());
                String result = "";
//                isConnect = post.isConnected();
  //              if(isConnect) {
                    result = post.doPost(nameValuePairs);
                    jsonObj = new JSONObject(result);
                    Log.i("Result", result+"");
                    if(jsonObj.getInt("success") == 1)
                        res = true;
    //            }

            } catch (JSONException e) {
                e.printStackTrace();
            }
            return res;
        }

        @Override
        protected void onPostExecute(final Boolean success) {
            mAuthTask = null;
            showProgress(false);

            if (success) {
//                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
//                intent.putExtra("jsonObj", jsonObj.toString());
//                startActivity(intent);
                txtShopCode.getText().clear();
                txtShopCode.requestFocus();
                Toast.makeText(getBaseContext(), "Your shop is geo tagged ", Toast.LENGTH_LONG).show();

            } else {
//                if(isConnect){
//                    mPasswordView.setError(getString(R.string.error_incorrect_password));
//                    mPasswordView.requestFocus();

//                }
//                else
                    Toast.makeText(getBaseContext(), R.string.geoTagError, Toast.LENGTH_LONG).show();
            }
        }

        @Override
        protected void onCancelled() {
            mAuthTask = null;
            showProgress(false);
        }
    }

    @Override
    public void onLocationChanged(Location location) {
        TextView locationTv = (TextView) findViewById(R.id.latlongLocation);
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        LatLng latLng = new LatLng(latitude, longitude);
        googleMap.addMarker(new MarkerOptions().position(latLng));
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));
        locationTv.setText("Latitude:" + latitude + ", Longitude:" + longitude);
    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub
    }

    private boolean isGooglePlayServicesAvailable() {
        int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (ConnectionResult.SUCCESS == status) {
            return true;
        } else {
            GooglePlayServicesUtil.getErrorDialog(status, this, 0).show();
            return false;
        }
    }

}
</code></pre>

<p>why is google map null? I'm using API in my meta deta</p>

<p><a href="https://i.stack.imgur.com/I23t9.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/I23t9.png" alt="enter image description here"></a></p>