2016-02-08 24 views
2

我使用的SDK-23,我每次运行应用程序,我SecurityException得到投掷和调试错误读取像这样:Android“的GPS需要ACCESS_FINE_LOCATION”错误

java.lang.SecurityException异常:“gps”位置提供商需要获得 ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限。

这似乎是一个简单的错误,但是,我的清单文件是完全正确的。在这儿,这里是我的MapActivity代码以及:

package com.buahbatu.salesmonitoring; 



public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
final static String TAG = "MainActivity"; 
SwitchCompat switchTracked; 
MyService service; 
private GoogleMap googleMap; 
Context mContext; 
private TextView textAddress; 


/* Google Fused Location Service */ 
public static GoogleApiClient mGoogleApiClient; 
public static LocationRequest mLocationRequest; 
public static GoogleApiClient.ConnectionCallbacks connectionCallbacks; 
public static GoogleApiClient.OnConnectionFailedListener onConnectionFailedListener; 
public final static int REQUEST_LOCATION = 199; 
public final static int REQUEST_CONNECTION = 11; 
public final static int NOTIFICATION_ID = 2; 

private static final String[] INITIAL_PERMS={ 
     Manifest.permission.ACCESS_FINE_LOCATION, 
     Manifest.permission.READ_CONTACTS 
}; 
private static final String[] LOCATION_PERMS={ 
     Manifest.permission.ACCESS_FINE_LOCATION 
}; 


boolean checkPermission() { 
    String location_fine = "android.permission.ACCESS_FINE_LOCATION"; 
    String location_coarse = "android.permission.ACCESS_COARSE_LOCATION"; 
    int permission_fine = mContext.checkCallingOrSelfPermission(location_fine); 
    int permission_coarse = mContext.checkCallingOrSelfPermission(location_coarse); 
    return permission_fine == PackageManager.PERMISSION_GRANTED && permission_coarse == PackageManager.PERMISSION_GRANTED; 
} 


public void startTracking(Activity activity) { 
    if (checkPermission()) { 
     Log.i(TAG, "startTracking"); 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (com.google.android.gms.location.LocationListener) this); 
    } else { 
     int permissionCheck = ContextCompat.checkSelfPermission(activity, 
       Manifest.permission.ACCESS_FINE_LOCATION); 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    try { 
     service.setUpdateView(null); 
     initilizeMap(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    checkLoggedStatus(); 
    setSupportActionBar((Toolbar) findViewById(R.id.top_toolbar)); 
    ((TextView) findViewById(R.id.username_text)).setText(AppConfig.getUserName(this)); 
    switchTracked = (SwitchCompat) findViewById(R.id.tracked_switch); 
    switchTracked.setOnCheckedChangeListener(onCheckedChangeListener); 
    switchTracked.setChecked(AppConfig.getOnTracked(this)); 
    findViewById(R.id.test_but).setOnClickListener(this); 
    textAddress = (TextView) findViewById(R.id.txtAddress); 
} 

CompoundButton.OnCheckedChangeListener onCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if (!isChecked) { 
      switchTracked.setText(R.string.untracked); 
      service.stopTracking(); 
      AppConfig.saveOnTracked(MainActivity.this, false); 
     } else { 
      switchTracked.setText(R.string.tracked); 
      service = AcaciaX.createService(getApplicationContext(), MyService.class); 
      service.startTracking(MainActivity.this); 
      service.setUpdateView((TextView) findViewById(R.id.location_text)); 
      AppConfig.saveOnTracked(MainActivity.this, true); 
     } 
    } 
}; 

void checkLoggedStatus() { 
    if (!AppConfig.getLoginStatus(this)) { 
     moveToLogin(); 
    } 
} 

void moveToLogin() { 
    Intent move = new Intent(this, LoginActivity.class); 
    startActivity(move); 
    finish(); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Log.d(TAG, Integer.toString(resultCode)); 

    //final LocationSettingsStates states = LocationSettingsStates.fromIntent(data); 
    switch (requestCode) { 
     case ServiceImpl.REQUEST_CONNECTION: 
      switch (resultCode) { 
       case Activity.RESULT_OK: { 

        switchTracked.setChecked(true); 
        break; 
       } 
       case Activity.RESULT_CANCELED: { 

        Toast.makeText(this, "Location not enabled, user cancelled.", Toast.LENGTH_LONG).show(); 
        break; 
       } 
       default: { 
        break; 
       } 
      } 
      break; 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_logout) { 
     AppConfig.saveLoginStatus(this, false); 
     AppConfig.storeAccount(this, "", ""); 
     switchTracked.setChecked(false); 

     moveToLogin(); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onClick(View v) { 
    NetHelper.login(MainActivity.this, "Tester", "pasu", new PostWebTask.HttpConnectionEvent() { 
     @Override 
     public void preEvent() { 

     } 

     @Override 
     public void postEvent(String... result) { 

     } 
    }); 

} 

private void initilizeMap() { 
    if (googleMap == null) { 
     googleMap = ((MapFragment) getFragmentManager().findFragmentById(
       R.id.map)).getMap(); 
     setUpMap(); 

     // check if map is created successfully or not 
     if (googleMap == null) { 
      Toast.makeText(getApplicationContext(), 
        "Sorry! unable to create maps", Toast.LENGTH_SHORT) 
        .show(); 
     } 
     if (googleMap != null) { 
      //setUpMap(); 
     } 
    } 

} 

@Override 
protected void onResume() { 
    super.onResume(); 
    initilizeMap(); 
    //googleMap.setMyLocationEnabled(true); 
    setUpMap(); 
} 

public void setUpMap() { 
    if(checkPermission()) { 
     googleMap.setMyLocationEnabled(true); 
     LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     Criteria criteria = new Criteria(); 
     String provider = locationManager.getBestProvider(criteria, true); 
     Location location = locationManager.getLastKnownLocation(provider); 

     CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude())); 
     CameraUpdate zoom = CameraUpdateFactory.zoomTo(15); 

     googleMap.moveCamera(center); 
     googleMap.animateCamera(zoom); 

     Geocoder geocoder; 
     List<Address> addresses; 
     geocoder = new Geocoder(this, Locale.getDefault()); 

     try { 
      addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); 

      if (addresses != null) { 
       String address = addresses.get(0).getAddressLine(0); 
       String city = addresses.get(0).getLocality(); 
       String state = addresses.get(0).getAdminArea(); 
       String country = addresses.get(0).getCountryName(); 
       String postalCode = addresses.get(0).getPostalCode(); 
       String knowName = addresses.get(0).getFeatureName(); 

       String addressfull = address + " " + city + " " + state + " " + country + " " + postalCode + " " + knowName; 

       Intent intent = new Intent(); 
       intent.putExtra("addressfull", addressfull); 
       textAddress.setText(addressfull); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    }else{ 
     requestPermissions(INITIAL_PERMS, 2); 
    } 

} 

} 
+0

请妥善格式化您的代码,以方便摘要。另外,你可以看看这个:http://www.stackoverflow.com/help/mcve –

回答

1

如果你是针对Android的男,你需要问用户权限访问设备的GPS。这是一个不太干净的代码,但可能会对你有所帮助。更好的方法是创建自己的权限管理器类来处理请求和alertDialog事件。

请告诉我下面发生的事情是

1)如果权限授予您检查。 2)如果没有,你正在检查权限是否被拒绝,在这种情况下,你正在显示的理由,向用户解释为什么你需要权限。 3)使用ActivityCompat显示请求权限弹出窗口。 4)如果用户拒绝,只要您需要访问GPS但注意到未授予权限,则显示带有查看按钮的快餐栏以将用户带到应用程序信息屏幕。

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.ACCESS_COARSE_LOCATION)) { 
      showRationale(); 
     } else { 
      // do request the permission 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 8); 
     } 
    } 

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 

    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){ 
       //Start your code 
      } else { 
       //Show snackbar 
      } 
    } 
} 

private void showRationale(){ 
    String strDeleteMessage = getResources().getString(R.string.rationale_message11) ; 

    final View dialogView = LayoutInflater.from(this.getActivity()).inflate(R.layout.dialog_fragment, null); 

    final AlertDialog storageRationaleAlert = new AlertDialog.Builder(this.getActivity()).create(); 
    storageRationaleAlert.setView(dialogView, 0, 0, 0, 0); 
    storageRationaleAlert.setCanceledOnTouchOutside(false); 
    TextView mDialogTitle = (TextView) dialogView.findViewById(R.id.dialog_title); 
    TextView mDialogDetails = (TextView) dialogView.findViewById(R.id.dialog_details); 
    mDialogDetails.setVisibility(View.VISIBLE); 
    Button mCancelButton = (Button) dialogView.findViewById(R.id.cancel_btn); 
    Button mOkButton = (Button) dialogView.findViewById(R.id.ok_btn); 
    mOkButton.setText(getString(R.string.dialog_continue)); 

    mDialogDetails.setText(Html.fromHtml(strDeleteMessage)); 

    final Activity activity = this.getActivity(); 
    mOkButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      storageRationaleAlert.dismiss(); 

      //Ask for GPS permission 
     } 
    }); 

    mCancelButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      storageRationaleAlert.dismiss(); 
      //Show permission snackbar 
     } 
    }); 

    storageRationaleAlert.show(); 
} 
相关问题