2017-10-11 75 views
0

我已經爲我的應用程序實現了谷歌地圖和谷歌地點。我已經意識到,當我第一次安裝應用程序時,谷歌地圖不能正確初始化,即當使用允許谷歌地圖的權限通過權限彈出對話框,谷歌地圖窗口默認爲其原始地圖,而不顯示我的當前位置,也地方自動填充字段不起作用(意思是谷歌地圖沒有初始化)。但是,當我運行應用程序的第二次和第三次,它完美的作品。谷歌地圖V2在授予彈出對話框權限後未初始化

下面是我的代碼:

public class MapsActivity extends AppCompatActivity implements 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, 
     View.OnClickListener, OnMapReadyCallback, 
     LocationListener { 
    protected GoogleApiClient mGoogleApiClient; 
    private boolean executeOnStart = false; 
    LocationRequest mLocationRequest; 
    private static final LatLngBounds BOUNDS_INDIA = new LatLngBounds(
      new LatLng(-0, 0), new LatLng(0, 0)); 
    public GoogleMap mMap; 
    Location mLastLocation; 
    Marker mCurrLocationMarker; 
    private String mapAddress = null; 
    private ImageView imageView; 
    private Button checkAvailability; 
    private StringBuilder sb = null; 
    private EditText mAutocompleteView; 
    private Geocoder geocoder; 
    private MarkerOptions markerOptions; 
    private LatLng latLng; 
    private Marker marker; 
    private RecyclerView mRecyclerView; 
    private LinearLayoutManager mLinearLayoutManager; 
    private PlacesAutoCompleteAdapter mAutoCompleteAdapter; 
    PlacesAutoCompleteAdapter.PlaceAutocomplete item; 
    String featureName, locality, countryName; 
    String placeId; 
    ImageView delete; 
    SupportMapFragment mapFragment; 
    private boolean allowEditTextChangeListener = true; 
    private LatLng pos; 
    static boolean invalidLocation = false; 
    private LinearLayout linearLayout; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     buildGoogleApiClient(); 
     setContentView(R.layout.activity_search); 
     mAutocompleteView = (EditText) findViewById(R.id.autocomplete_places); 

     mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(MapsActivity.this); 

     linearLayout = (LinearLayout) findViewById(R.id.linear_layout); 

     Log.d("allowEditTextChange1",allowEditTextChangeListener + ""); 
     checkAvailability = (Button) findViewById(R.id.check_availability); 
     checkAvailability.setTypeface(Display.displayTypeface(getApplicationContext(), 1)); 


     geocoder = new Geocoder(this, Locale.getDefault()); 
     markerOptions = new MarkerOptions(); 

     buildGoogleApiClient(); 
     delete = (ImageView) findViewById(R.id.cross); 

     mAutoCompleteAdapter = new PlacesAutoCompleteAdapter(this, R.layout.searchview_adapter, 
       mGoogleApiClient, BOUNDS_INDIA, null); 

     mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
     mLinearLayoutManager = new LinearLayoutManager(this); 
     mRecyclerView.setLayoutManager(mLinearLayoutManager); 
     mRecyclerView.setAdapter(mAutoCompleteAdapter); 
     // mRecyclerView.setLayoutFrozen(true); 
     delete.setOnClickListener(this); 

     if (allowEditTextChangeListener) { 
      Log.d("allowEditTextChangz1",allowEditTextChangeListener + ""); 
      mAutocompleteView.addTextChangedListener(new TextWatcher() { 
       public void onTextChanged(CharSequence s, int start, int before, 
              int count) { 
        Log.d("allowEditTextChangz1","jo"); 
        if (!s.toString().equals("") && mGoogleApiClient.isConnected()) { 
         mAutoCompleteAdapter.getFilter().filter(s.toString()); 
        } else if (!mGoogleApiClient.isConnected()) { 
        // Toast.makeText(getApplicationContext(), Constants.API_NOT_CONNECTED, Toast.LENGTH_SHORT).show(); 
         Log.e(Constants.PlacesTag, Constants.API_NOT_CONNECTED); 
        } 

       } 

       public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
       public void afterTextChanged(Editable s) {} 
      }); 
     } 
     mRecyclerView.addOnItemTouchListener(
       new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() { 
        @Override 
        public void onItemClick(View view, int position) { 
         item = mAutoCompleteAdapter.getItem(position); 
         placeId = String.valueOf(item.placeId);PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi 
           .getPlaceById(mGoogleApiClient, placeId); 
         placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() { 
          @Override 
          public void onResult(PlaceBuffer places) { 
           if (places.getCount() == 1) { 
            mAutoCompleteAdapter.clear(); 
            mAutocompleteView.setText(""); 
            String country = ""; 

            CameraPosition cameraPosition = new CameraPosition.Builder() 
              .target(places.get(0).getLatLng())  // Sets the center of the map to Mountain View 
              .zoom(12)     // Sets the zoom 
              .bearing(90)    // Sets the orientation of the camera to east 
              .tilt(30)     // Sets the tilt of the camera to 30 degrees 
              .build();     // Creates a CameraPosition from the builder 

            marker.remove(); // remove any marker from maponclick or maponlonclick 
            marker = mMap.addMarker(new MarkerOptions().position(places.get(0).getLatLng()) 
              .title("My Location")); 
            mMap.setTrafficEnabled(true); 
            mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
          } 
         }); 
         Log.i("TAG", "Clicked: " + item.description); 
         Log.i("TAG", "Called getPlaceById to get Place details for " + item.placeId); 
        } 
       }) 
     ); 

     imageView = (ImageView) findViewById(R.id.maps_close); 
     imageView.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Log.d("close", "close"); 
       if (mAutoCompleteAdapter.getItemCount() != 0){ 
        mAutoCompleteAdapter.clear(); 
       } 
       mAutocompleteView.setText(""); 
      } 
     }); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      checkLocationPermission(); 
     } 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 
     mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (ContextCompat.checkSelfPermission(this, 
        Manifest.permission.ACCESS_FINE_LOCATION) 
        == PackageManager.PERMISSION_GRANTED) { 
       buildGoogleApiClient(); 
       mMap.setMyLocationEnabled(true); 

      } 
     } else { 
      buildGoogleApiClient(); 
      mMap.setMyLocationEnabled(true); 

     } 

    } 

    @Override 
    public void onLocationChanged(Location location) { 

     mLastLocation = location; 

     if (mCurrLocationMarker != null) { 
      mCurrLocationMarker.remove(); 
     } 

     final Double lat = location.getLatitude(); 
     final Double lng = location.getLongitude(); 
     Log.d("LATLANGz", lat + "|" + lng); 
     latLng = new LatLng(lat, lng); 
     markerOptions = new MarkerOptions(); 
     markerOptions.position(latLng); 
     markerOptions.title("Current Positionn"); 
     markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); 
     marker = mMap.addMarker(markerOptions); 

     mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
     mMap.animateCamera(CameraUpdateFactory.zoomTo(11)); 

     if (mGoogleApiClient != null) { 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
     } 
    } 

    protected synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .addApi(Places.GEO_DATA_API) 
       .build(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onConnectionSuspended(int i) {} 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) {} 

    @Override 
    public void onClick(View v) { 
     if(v==delete){ 
      mAutocompleteView.setText(""); 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     if (!mGoogleApiClient.isConnected() && !mGoogleApiClient.isConnecting()){ 
      Log.v("Google API","Connecting"); 
      mGoogleApiClient.connect(); 
     } 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     if(mGoogleApiClient.isConnected()){ 
      Log.v("Google API","Dis-Connecting"); 
      mGoogleApiClient.disconnect(); 
     } 
    } 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
    } 

    public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 
    public boolean checkLocationPermission(){ 
     if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.ACCESS_FINE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
        Manifest.permission.ACCESS_FINE_LOCATION)) { 
       ActivityCompat.requestPermissions(this, 
         new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
         MY_PERMISSIONS_REQUEST_LOCATION); 

      } else { 
       ActivityCompat.requestPermissions(this, 
         new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
         MY_PERMISSIONS_REQUEST_LOCATION); 
      } 
      return false; 
     } else { 
      return true; 
     } 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(1000); 
     mLocationRequest.setFastestInterval(1000); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 

     if (mGoogleApiClient.isConnected()){ 
      if (ContextCompat.checkSelfPermission(this, 
        Manifest.permission.ACCESS_FINE_LOCATION) 
        == PackageManager.PERMISSION_GRANTED) { 
       LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
      } 
     } 
    } 
    @Override 
    public void onRequestPermissionsResult(int requestCode, 
              String permissions[], int[] grantResults) { 
     switch (requestCode) { 
      case MY_PERMISSIONS_REQUEST_LOCATION: { 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        if (ContextCompat.checkSelfPermission(this, 
          Manifest.permission.ACCESS_FINE_LOCATION) 
          == PackageManager.PERMISSION_GRANTED) { 

         if (mGoogleApiClient == null) { 
          buildGoogleApiClient(); 
         } 
        } 

       } else { 
       } 
       return; 
      } 
     } 
    } 

    @Override 
    public void onStart(){ 
     super.onStart(); 
     if (isNetworkAvailable() == true){ 
      if (isLocationEnabled(getApplicationContext())){ 
       if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
        checkLocationPermission(); 
       } 
       // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
       SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
         .findFragmentById(R.id.map); 
       mapFragment.getMapAsync(this); 
      } else{ 
       showLocationDialog(); 
      } 
     } else { 
      showInternetDialog(); 
     } 

    } 

    public void showInternetDialog(){ 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage("Please turn on mobile network or Wi-Fi in Settings.") 
       .setTitle("WIFI Disabled") 
       .setCancelable(false) 
       .setPositiveButton("Settings", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           Intent i = new Intent(Settings.ACTION_WIRELESS_SETTINGS); 
           startActivity(i); 
          } 
         } 
       ) 
       .setNegativeButton("Cancel", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           MapsActivity.this.finish(); 
          } 
         } 
       ); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 

    // check internet connectivity 
    public boolean isNetworkAvailable() { 
     ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetworkInfo = connectivityManager 
       .getActiveNetworkInfo(); 
     return activeNetworkInfo != null; 
    } 

    public static boolean isLocationEnabled(Context context) { 
     int locationMode = 0; 
     String locationProviders; 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ 
      try { 
       locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE); 

      } catch (Settings.SettingNotFoundException e) { 
       e.printStackTrace(); 
       return false; 
      } 

      return locationMode != Settings.Secure.LOCATION_MODE_OFF; 

     }else{ 
      locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); 
      return !TextUtils.isEmpty(locationProviders); 
     } 
    } 

    public void showLocationDialog(){ 
     executeOnStart = true; 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage(R.string.gps_not_found_message) 
       .setTitle(R.string.gps_not_found_title) 
       .setCancelable(false) 
       .setPositiveButton("Settings", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
           startActivity(i); 
          } 
         } 
       ) 
       .setNegativeButton("Cancel", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dg, int id) { 
           MapsActivity.this.finish(); 

          } 
         } 
       ); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 
} 

回答

0

對於當前的位置:這是因爲你的onMapReady()做:

buildGoogleApiClient(); 
mMap.setMyLocationEnabled(true); 

如果已經授予的權限,只有:

if (mGoogleApiClient == null) { 
    buildGoogleApiClient(); 
} 
onRequestPermissionsResult()

。只需添加mMap.setMyLocationEnabled(true);onRequestPermissionsResult()這樣的:

if (mGoogleApiClient == null) { 
    buildGoogleApiClient(); 
    mMap.setMyLocationEnabled(true); 
} 

對於自動完成:在protected void onCreate(Bundle savedInstanceState)你叫buildGoogleApiClient();並得到許可(在第一次應用程序啓動)之前創建mAutoCompleteAdapter

... 
buildGoogleApiClient(); 
delete = (ImageView) findViewById(R.id.cross); 

mAutoCompleteAdapter = new PlacesAutoCompleteAdapter(this, R.layout.searchview_adapter, mGoogleApiClient, BOUNDS_INDIA, null); 
.... 

所以,你也應該叫mAutoCompleteAdapter = new PlacesAutoCompleteAdapter(...)onRequestPermissionsResult()

+0

這個工作,非常感謝你:) –

+0

所以,你可以接受答案:)(要做到這一點,你應該點擊問題率下的複選標記,在左邊的右側在投票箭頭下方,它應該變成綠色。) –

+0

@ G.Joe Thanx!祝你好運! –

0

也許你沒有正確期間 onRequestPermissionsResult方法加載它。 嘗試一些技巧在啓動頁面活動期間詢問權限請求。

+0

這是一個好主意,所以我應該問我的所有應用程序權限的啓動畫面活動? –

+0

是的,第一次你的應用程序啓動畫面正在運行 –