2016-01-04 2 views
0

У меня есть приложение, отображающее текущее местоположение пользователя на карте Google, приложение работает в эмуляторе (хотя оно не показывает местоположение), однако оно сбой в реальном устройстве. Здесь ошибка я получаюПриложение работает в эмуляторе, но сбой в реальном устройстве

01-04 15: 00: 59,509 26494-26494/io.xgear.geotag E/AndroidRuntime: FATAL ИСКЛЮЧЕНИЕ: главный java.lang.RuntimeException: Не удалось запустить активность ComponentInfo {io.xgear.geotag/io.xgear.geotag.MainActivity}: java.lang.NullPointerException

на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1659)

на android.app.ActivityThread.handleLaunchAct ivity (ActivityThread.java:1675)

в android.app.ActivityThread.access $ 1500 (ActivityThread.java:121)

в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:943)

на android.os.Handler.dispatchMessage (Handler.java:99)

на android.os.Looper.loop (Looper.java:130)

на android.app.ActivityThread.main (ActivityThread.java:3701)

на java.lang.reflect.Method.invokeNative (нативный метод)

в java.lang.reflect.Method.invoke (Method.java:507)

на com.android.internal. os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:866)

на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:624)

в dalvik.system.NativeStart.main (Родной метод)

Вызванный: java.lang.NullPointerException

на io.xgear.geotag.MainActivity.onCreate (MainActivity.java:72)

на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047)

на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1623)

на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:1675)

в android.app.ActivityThread.access $ 1500 (ActivityThread.java:121)

в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:943)

в android.os.Handler .dispatchMessage (Handler.java:99)

at android.os.Looper.loop (Looper.Java: 130)

на android.app.ActivityThread.main (ActivityThread.java:3701)

в java.lang.reflect.Method.invokeNative (метод Native)

в java.lang. reflect.Method.invoke (Method.java:507)

на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:866)

в com.android.internal.os .ZygoteInit.main (ZygoteInit.java:624)

на dalvik.system.NativeStart.main (Native Method)

и вот мой код основной деятельности

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 && 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 >= 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<Void, Void, Boolean> { 
     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; 
     } 
    } 

} 

почему Google Map пустой? Я использую API в моем мета ДЭТА

enter image description here

+0

Проверьте линию 'MainActivity.java: 72' –

+0

googleMap.setMyLocationEnabled (истина); это строка – MIC

+0

. Это строка, вызывающая проблему. Поддержка SupupMapFragmentMapFragment = (SupportMapFragment) getSupportFragmentManager(). findFragmentById (R.id.googleMap); googleMap = supportMapFragment.getMap(); googleMap.setMyLocationEnabled (true); 'где' googleMap' объект имеет значение –

ответ

0

Изменить Вас или создать, чтобы начать с

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

Удалить дополнительные setContentView вызовы.

Использование getMapAsyc для обработки асинхронной инициализации карты:

SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.googleMap); 
supportMapFragment.getMapAsync(new OnMapReadyCallback(){ 
    @Override 
    public void onMapReady(final GoogleMap map) { 
     map.setMyLocationEnabled(true); 
    } 
}); 
+0

getMapAsync дает ошибки – MIC

+0

@MIC какие ошибки? – miensol

+0

не может решить getMapAsync() – MIC

Смежные вопросы