2017-11-26 13 views
0

私は上記でdesribeしたこの瞬間に立ち往生します。 Google Direction Apiを使用して、選択したマーケットに方向を示す方法がありますか?私はこれについていくつかの答えを探していましたが、すべての種類のチュートリアルでは、最初から道順を表示する方法について説明しています。私が達成したいのは、クリック後の方向を示すボタンです。Googleマップでマーカーを貼り付けて、選択した方向に表示します

ここに私が必要とするいくつかの特別な機能を既に宣言している私のMapsActivityがあります。

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

    private GoogleMap mMap; 
    private static final String TAG = MapsActivity.class.getSimpleName(); 
    LocationManager locationManager; 
    LocationRequest mLocationRequest; 
    GoogleApiClient mGoogleApiClient; 
    Location mLastLocation; 
    Marker mCurrLocationMarker; 
    Button logoutButton; 

    private FirebaseAuth.AuthStateListener mAuthListener; 
    private FirebaseAuth mAuth; 
    private GoogleSignInClient mGoogleSignInClient; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     View decor_View = getWindow().getDecorView(); 

     int ui_Options = View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
       | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
       | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
       | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
       | View.SYSTEM_UI_FLAG_FULLSCREEN 
       | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; 

     decor_View.setSystemUiVisibility(ui_Options); 

     UiChangeListener(); 

     setContentView(R.layout.activity_maps); 

     // 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); 

     mAuth = FirebaseAuth.getInstance(); 

     logoutButton = (Button) findViewById(R.id.logoutButton); 

     logoutButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       signOut(); 
       Intent intent = new Intent(MapsActivity.this, SignInActivity.class); 
       startActivity(intent); 
       finish(); 
      } 
     }); 

     mAuth = FirebaseAuth.getInstance(); 
     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 

       if (firebaseAuth.getCurrentUser() == null) { 
        startActivity(new Intent(MapsActivity.this, SignInActivity.class)); 
       } 
      } 
     }; 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

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

    private void signOut() { 
     mAuth.signOut(); 
    } 

    /** 
    * Manipulates the map once available. 
    * This callback is triggered when the map is ready to be used. 
    * This is where we can add markers or lines, add listeners or move the camera. In this case, 
    * we just add a marker near Sydney, Australia. 
    * If Google Play services is not installed on the device, the user will be prompted to install 
    * it inside the SupportMapFragment. This method will only be triggered once the user has 
    * installed Google Play services and returned to the app. 
    */ 
    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 
     mMap.getUiSettings().setMapToolbarEnabled(false); 

     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (ContextCompat.checkSelfPermission(this, 
        Manifest.permission.ACCESS_FINE_LOCATION) 
        == PackageManager.PERMISSION_GRANTED) { 
       //Location Permission already granted 
       buildGoogleApiClient(); 
       mMap.setMyLocationEnabled(true); 
      } else { 
       //Request Location Permission 
       checkLocationPermission(); 
      } 
     } else { 
      buildGoogleApiClient(); 
      mMap.setMyLocationEnabled(true); 
     } 


     try { 
      // Customise the styling of the base map using a JSON object defined 
      // in a raw resource file. 
      boolean success = googleMap.setMapStyle(
        MapStyleOptions.loadRawResourceStyle(
          this, R.raw.custom_google_map)); 

      if (!success) { 
       Log.e(TAG, "Style parsing failed."); 
      } 
     } catch (Resources.NotFoundException e) { 
      Log.e(TAG, "Can't find style. Error: ", e); 
     } 

     if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.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; 
     } 

     Marker marker = mMap.addMarker(new MarkerOptions() 
       .position(new LatLng(51.1117744, 17.0353596)) 
       .title("Giselle French Bakery Cafe") 
       .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))); 

    } 

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


    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(20 * 1000); 
     mLocationRequest.setFastestInterval(20 * 1000); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
     if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 

    @Override 
    public void onLocationChanged(Location location) { 
     mLastLocation = location; 
     if (mCurrLocationMarker != null) { 
      mCurrLocationMarker.remove(); 
     } 

     //Place current location marker 
     LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
     MarkerOptions markerOptions = new MarkerOptions(); 
     markerOptions.position(latLng); 
     markerOptions.title("You are here"); 
     markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)); 
     mCurrLocationMarker = mMap.addMarker(markerOptions); 

     //move map camera 
     mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 18)); 

    } 

    public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 

    private void checkLocationPermission() { 
     if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED) { 

      // Should we show an explanation? 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
        Manifest.permission.ACCESS_FINE_LOCATION)) { 

       // Show an explanation to the user *asynchronously* -- don't block 
       // this thread waiting for the user's response! After the user 
       // sees the explanation, try again to request the permission. 
       new AlertDialog.Builder(this) 
         .setTitle("Location Permission Needed") 
         .setMessage("This app needs the Location permission, please accept to use location functionality") 
         .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialogInterface, int i) { 
           //Prompt the user once explanation has been shown 
           ActivityCompat.requestPermissions(MapsActivity.this, 
             new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
             MY_PERMISSIONS_REQUEST_LOCATION); 
          } 
         }) 
         .create() 
         .show(); 


      } else { 
       // No explanation needed, we can request the permission. 
       ActivityCompat.requestPermissions(this, 
         new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
         MY_PERMISSIONS_REQUEST_LOCATION); 
      } 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, 
              String permissions[], int[] grantResults) { 
     switch (requestCode) { 
      case MY_PERMISSIONS_REQUEST_LOCATION: { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

        // permission was granted, yay! Do the 
        // location-related task you need to do. 
        if (ContextCompat.checkSelfPermission(this, 
          Manifest.permission.ACCESS_FINE_LOCATION) 
          == PackageManager.PERMISSION_GRANTED) { 

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

       } else { 

        // permission denied, boo! Disable the 
        // functionality that depends on this permission. 
        Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show(); 
       } 
       return; 
      } 

      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 

    public void UiChangeListener() { 
     final View decorView = getWindow().getDecorView(); 
     decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { 
      @Override 
      public void onSystemUiVisibilityChange(int visibility) { 
       if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { 
        decorView.setSystemUiVisibility(
          View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
            | View.SYSTEM_UI_FLAG_FULLSCREEN 
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 
       } 
      } 
     }); 
    } 
} 

誰かがそれを達成する方法を私に答えることができる:)

+0

もう少し説明してください...あなたはマーカーを選択したいのですが、クリックすると距離が表示されます。 –

答えて

0

をあなたが方向性を表示したい場所から指定されていませんが、あなたはあなたのJavaコードで場所を実装してきたように、私はと希望あなたの現在の場所とクリックされたマーカーの間の方向を表示したいと仮定します。

まず、私の答えhereに行き、距離、時間、方向に必要な3つのJavaファイルをすべて作成してください。

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener, GoogleMap.OnMarkerClickListener { 
    . 
    . 
    . 
    @Override 
    public void onMapReady(GoogleMap mMap){ 
    . 
    . 
    . 
    map.setOnMarkerClickListener(this); 
    . 
    . 
    . 
    } 
    @Override 
    public boolean onMarkerClick(final Marker marker) { 
     LatLng latLng = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude()); 
     distance_task.getDirectionsUrl(latLng, marker.getPosition()); 
     distance_task.setLoadListener(new CalculateDistanceTime.taskCompleteListener() { 
         @Override 
         public void taskCompleted(String[] time_distance) { 
          text1.setText(time_distance[0]); //Distance 
          text2.setText(time_distance[1]); //Time 
         } 
        }); 
     String url = getDirectionsUrl(latLng, marker.getPosition()); 
     DownloadTask downloadTask = new DownloadTask(); 
     downloadTask.execute(url); 
    } 
    . 
    . 
    . 
    } 

上記のコードは、あなたにその2点(yourLocation、マーカー)、時間(車を使用して撮影したもの)とポリラインとの間の距離を提供します:次のように

はその後、あなたのプログラムにonMarkerClick実装しますポリラインを単独で実装しますが、エラーを表示する以外は距離と時間を設定するために2つのTextview(text1とtext2)を渡すことを忘れないでください。

また、方向のみを使用する場合は、DirectionsJSONParser.javaとonMarkerClickの上記コードの最後の3行だけを使用してください。

これは私が同じように使っているが、あなたのアプリがクラッシュすることなく円滑に動くように考慮する必要があるいくつかの追加事項があります。これらの問題のいくつかは、このコードは、mLastLocationがヌルでないとき、インターネット接続があるとき、GPSがオンになっているときなどにのみ実行する必要があります。

EDIT:は(直接私のプロジェクトからコピー)

2つのグローバル変数

Polyline lastPolyline; 
boolean isSecond = false; 

を宣言次にクラスParserTaskでonPostExecute()メソッドで:

を置き換えますと

if (isSecond) { 
    lastPolyline.remove(); 
    lastPolyline = googleMap.addPolyline(lineOptions); 
    } 
else { 
    lastPolyline = googleMap.addPolyline(lineOptions); 
    isSecond = true; 
    } 
+0

本当に素晴らしいですね。できるだけ早く全部のものを実装し、それが適切に動作すると答えます。しかし、Google Directionはどうですか?あなたはここでそれを使用していますか? – deisy

+0

問題が発生しました。最後の3つのメソッドを定義する方法がわかりません。また、onMarkerClickがステートメントを返す必要があるというメッセージが表示されます。私にこのことを説明する時間があれば、本当に大事です。 – deisy

+0

このように、これは違法ですか?ポリラインを使用していれば合法ですか?これは本当にこのように重要です。もちろん、すべてうまく動作します。私は昨日すべてを変更しています。本当に偉大で適切な解決策です。 – deisy

関連する問題