2016-11-24 6 views
1

私は、緯度と経度を使用して2つの場所の間の期間だけをユーザーに表示しようとしています。私はどのようにそれを処理するか分からないアクセス許可に問題があります。ここでGoogleマップを使用して期間を表示するにはどうすればよいですか?

は私のdoInBackgroundコードです:ここで

protected String[] doInBackground(String... params) { 


      try { 
       LocationManager locationManager = (LocationManager) MyCustomHomeActivity.this 
         .getSystemService(LOCATION_SERVICE); 

       // getting GPS status 
       boolean isGPSEnabled = locationManager 
         .isProviderEnabled(LocationManager.GPS_PROVIDER); 

       // getting network status 
       boolean isNetworkEnabled = locationManager 
         .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

       if (!isGPSEnabled && !isNetworkEnabled) { 
        // no network provider is enabled 
       } else { 

        // if GPS Enabled get lat/long using GPS Services 
        if (isGPSEnabled) { 

          if (locationManager != null) { 
           location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

           if (location != null) { 
            latitude = location.getLatitude(); 
            longitude = location.getLongitude(); 
           } 
          } 
         } 
        } 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 


      String shuLat = "41.2207188"; 
      String shuLong = "-73.24168179999999"; 
      String forecastJsonStr = null; 

      String myUrlSetup = "https://maps.googleapis.com/maps/api/directions/json?origin="+latitude + "," + longitude +"&destination="+shuLat +"," + shuLong + "&departure_time=now&traffic_model=best_guess&key=AIzaSyB6l8vrnspw2-1Q_cnzO03JlAsIOMl-7bs"; 
      HttpURLConnection urlConnection = null; 
      BufferedReader reader = null; 

      try { 

       URL url; 
       url = new URL(myUrlSetup); 


       // Create the request to GoogleMapAPI, and open the connection 
       urlConnection = (HttpURLConnection) url.openConnection(); 
       urlConnection.setRequestMethod("GET"); 
       urlConnection.connect(); 

       // Read the input stream into a String 
       InputStream inputStream = urlConnection.getInputStream(); 
       StringBuffer buffer = new StringBuffer(); 
       if (inputStream == null) { 
        // Nothing to do. 
        return null; 
       } 
       System.out.println("I am in doInBackground step3"); 
       reader = new BufferedReader(new InputStreamReader(inputStream)); 

       String line; 
       while ((line = reader.readLine()) != null) { 
        // Since it's JSON, adding a newline isn't necessary (it won't affect parsing) 
        // But it does make debugging a *lot* easier if you print out the completed 
        // buffer for debugging. 
        buffer.append(line + "\n"); 
       } 

       if (buffer.length() == 0) { 
        // Stream was empty. No point in parsing. 
        return null; 
       } 
       forecastJsonStr = buffer.toString(); 

       Log.v(LOG_TAG, "Forecast string: " + forecastJsonStr); 
      } catch (IOException e) { 
       Log.e(LOG_TAG, "Error ", e); 
       // If the code didn't successfully get the weather data, there's no point in attemping 
       // to parse it. 
       return null; 
      } finally { 
       if (urlConnection != null) { 
        urlConnection.disconnect(); 
       } 
       if (reader != null) { 
        try { 
         reader.close(); 
        } catch (final IOException e) { 
         Log.e(LOG_TAG, "Error closing stream", e); 
        } 
       } 
      } 

      try { 
       System.out.println("I am just in front of calling getDurationDataFromJson"); 
       return getDurationDataFromJson(forecastJsonStr); 
      } catch (JSONException e) { 
       Log.e(LOG_TAG, e.getMessage(), e); 
       e.printStackTrace(); 
      } 
      return new String[0]; 
     }//end doInBackground 

は私getDurationDataFromJSONコードです:

location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

エラー:私は直面しています

private String[] getDurationDataFromJson(String forecastJsonStr) 
     throws JSONException { 

    // These are the names of the JSON objects that need to be extracted. 
    final String OWM_ROUTES = "routes"; 
    final String OWM_LEGS = "legs"; 
    final String OWM_DURATION = "duration"; 
    final String OWM_TEXT = "text"; 


    String[] resultStrs = new String[0]; 
    String duration; 

    JSONObject durationJson = new JSONObject(forecastJsonStr); 

    JSONArray routeArray = durationJson.getJSONArray(OWM_ROUTES); 

    JSONArray legArray = routeArray.getJSONObject(0).getJSONArray(OWM_LEGS); 

    //Duration 
    JSONObject durationObj = legArray.getJSONObject(0).getJSONObject(OWM_DURATION); 

    duration = durationObj.getString(OWM_TEXT); 

    resultStrs[0] = duration; 

    System.out.println("Duration is: " + duration); 
    for (String s : resultStrs) { 
     System.out.println("Duration entry: " + s); 
     Log.v(LOG_TAG, "Duration entry: " + s); 
    } 
    return resultStrs; 

} 

トラブルはdoInBackGroundコードに次の一部です:

Call requires permission which may be rejected by user: code should explicitly check to see if permission is available(with `check permission`) or explicitly handle a potential `SecurityException`. 

私が正しい方向に向いているかどうかはわかりません。これで私を導いてください。許可が実行時間で要求されているAndroidのAPIレベル(23)と

+0

マニフェストから権限を表示できますか?どのOSバージョンをお試しになりますか?あなたはAPI23以来の新しいpermision apiに精通していますか? – snachmsm

+0

これはマニフェスト – Venkata

+0

[https:///developer.android.com/training/permissions/requesting.html](https://developer.android.com/training/permissions/requesting.html) – snachmsm

答えて

1

は、ここであなたは、公式ドキュメントを解除しています

https://developer.android.com/training/permissions/requesting.html

基本的に、あなたは、デバイスのAndroid APIレベルは> =であるかどうかを確認する必要があります23、必要な場合は必要な権限を要求します。

if (Build.VERSION.SDK_INT >= 23) 
     //Ask for needed permissions following the docs mentioned above 
} 

私はこれが役に立ちますようお願いいたします。

+1

大きな助け!それは今働く。 – Venkata

0

最後に知られている場所を取得するには、FusedLocationProviderApi を使用するようお勧めします。

しかし、あなたはあなたのマニフェストに

  • android.permission.ACCESS_COARSE_LOCATION
  • QRアプリケーション

を提供していることを確認して必要な場所で何かを行う前に.xml。

私はあなたのところに来ました。 APIレベルから23アンドロイドは明示的なアクセス許可機能を求めています。これを提供するには、いくつかの手順を実行する必要があります。

私はここに必要なアクセス許可の状態とデバイスのロケーションサービス

public boolean isLocationEnabled() { 
 
    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 locationMode != Settings.Secure.LOCATION_MODE_OFF; 
 

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

 
} 
 

 
public boolean hasCoarseLocationPermission() { 
 
    return ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED; 
 
} 
 

 
public boolean hasFineLocationPermission() { 
 
    return ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; 
 
}

  • のチェッカーが今確認した後、あなたの活動/フラグメントを起動し、あなたのヘルプ -

    1. のためのいくつかのコード・ブロックを取り付け、積極的な許可を与える

    private void initiateYourActivityCallAfterCheckingPermission() { 
     
          if (hasCoarseLocationPermission() && hasFineLocationPermission()) { 
     
           if (locationUtil.isLocationEnabled()) { 
     
            startYourLocationActivity(); 
     
           } 
     
          } else if (!hasFineLocationPermission() && hasCoarseLocationPermission()) { 
     
           requestBothLocationPermission(); 
     
          } else if (hasFineLocationPermission() && hasCoarseLocationPermission()) { 
     
           requestFineLocationPermission(); 
     
          } else if (hasFineLocationPermission() && !hasCoarseLocationPermission()) { 
     
           requestCoarseLocationPermission(); 
     
          } 
     
    } 
     
    
     
    private void requestBothLocationPermission() { 
     
         if (ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) 
     
           && ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)) { 
     
    
     
         } else { 
     
          ActivityCompat.requestPermissions(SplashActivity.this, 
     
            new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 
     
            REQUEST_BOTH_LOCATION); 
     
         } 
     
        } 
     
    
     
        private void requestCoarseLocationPermission() { 
     
         if (ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this, 
     
           Manifest.permission.ACCESS_COARSE_LOCATION)) { 
     
    
     
         } else { 
     
          ActivityCompat.requestPermissions(SplashActivity.this, 
     
            new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION); 
     
         } 
     
        } 
     
    
     
        private void requestFineLocationPermission() { 
     
         if (ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this, 
     
           Manifest.permission.ACCESS_FINE_LOCATION)) { 
     
    
     
         } else { 
     
          ActivityCompat.requestPermissions(SplashActivity.this, 
     
            new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_FINE_LOCATION); 
     
         } 
     
        } 
     
    
     
    /** 
     
        * to process permission result 
     
        */ 
     
        @Override 
     
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     
         super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     
         switch (requestCode) { 
     
          case General.REQUEST_BOTH_LOCATION: 
     
           if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { 
     
            startYourLocationActivity(); 
     
           } 
     
           break; 
     
          case General.REQUEST_COARSE_LOCATION: 
     
           if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     
            startYourLocationActivity(); 
     
           } 
     
           break; 
     
          case General.REQUEST_FINE_LOCATION: 
     
           if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     
            startYourLocationActivity(); 
     
           } 
     
           break; 
     
         } 
     
        }

    これが役立つことを願っています。

  • 関連する問題