2016-06-07 3 views
4

У меня есть все предпосылки, определенные в моем манифесте для использования gps. КакУ провайдера местоположения Android 6.0 "gps" требуется разрешение ACCESS_FINE_LOCATION

"использует-разрешение андроида: имя =" android.permission.ACCESS_FINE_LOCATION "/>

"использует-разрешение андроида: имя =" android.permission.ACCESS_COARSE_LOCATION" />

Everytime я стараюсь для открытия этого действия на Android 6.0 он останавливается с этим сообщением logcat. Но работает на некоторых телефонах. Может кто-то помочь мне разобраться и предоставить решение. Я застрял в днях, пытаясь понять это, и как его решить.

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{org.data.smurf/org.data.smurf.Konkurranse}: java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission. 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
    at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:158) 
    at android.app.ActivityThread.main(ActivityThread.java:7224) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
Caused by java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission. 
    at android.os.Parcel.readException(Parcel.java:1620) 
    at android.os.Parcel.readException(Parcel.java:1573) 
    at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:688) 
    at android.location.LocationManager.requestLocationUpdates(LocationManager.java:908) 
    at android.location.LocationManager.requestLocationUpdates(LocationManager.java:469) 
    at org.data.smurf.Konkurranse.onCreate(Konkurranse.java:197) 
    at android.app.Activity.performCreate(Activity.java:6876) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
    at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:158) 
    at android.app.ActivityThread.main(ActivityThread.java:7224) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

Вот моя Конкурансия/Конкурсная деятельность. Я удалил код, не похожий на меню, и панель действий.

Public class Konkurranse Extends Activity { 

    /** 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FacebookSdk.sdkInitialize(getApplicationContext()); 
     Fresco.initialize(getApplicationContext()); 
     setContentView(R.layout.activity_konkurranse); 
     LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 



     final com.facebook.Profile profile = com.facebook.Profile.getCurrentProfile(); 
     final ProfilePictureView profilePictureView = (ProfilePictureView) findViewById(R.id.profilepic); 
     final TextView name = (TextView) findViewById(R.id.name); 
     simpleDraweeView = (SimpleDraweeView) findViewById(R.id.profilePicture); 
     RoundingParams roundingParams = RoundingParams.fromCornersRadius(50f); 
     roundingParams.setRoundAsCircle(true); 
     simpleDraweeView.getHierarchy().setRoundingParams(roundingParams); 


     /// Logged IN \\\ 
     if (profile != null) { 
      profilePictureView.getProfileId(); 
      profilePictureView.setProfileId(profile.getId()); 
      name.setText(profile.getName()); 
      simpleDraweeView.setImageURI(profile.getProfilePictureUri(100, 100)); 
     } 


     final SharedPreferences sharedPrefs = getSharedPreferences("details", MODE_PRIVATE); 
     //After referencing your Views, add this. 
     final String nameStr = sharedPrefs.getString("name", null); 
     final String idStr = sharedPrefs.getString("id", null); 
     AccessToken token = AccessToken.getCurrentAccessToken(); 
     if (token != null) { 
      if (nameStr != null) name.setText(nameStr); 
      if (idStr != null) profilePictureView.setProfileId(idStr); 
      simpleDraweeView.setImageURI(profile.getProfilePictureUri(100, 100)); 
     } 

     //.. Do the same for other profile data 


     mobilnummer = (EditText) findViewById(R.id.mobilnummer); 

     buttongps = (Button) findViewById(R.id.gps); 
     buttongps.setOnClickListener(onButtongpsClick); 

     buttonblue = (Button) findViewById(R.id.bluetooth); 
     buttonblue.setOnClickListener(onButtonblueClick); 


     final LocationManager manager; 
     manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     final ImageView gpsImg = (ImageView) findViewById(R.id.gpsstatus); 
     if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
      gpsImg.setImageResource(R.drawable.ok); 
     } else { 
      gpsImg.setImageResource(R.drawable.notok); //not ok 
     } 

     // Register bluettoth listener 
     bluetoothListener = new BluetoothListener() { 
      @Override 
      public void onBluetoothOff() { 
       btImg.setImageResource(R.drawable.notok); //not ok 
      } 

      @Override 
      public void onBluetoothOn() { 
       btImg.setImageResource(R.drawable.ok); 
      } 
     }; 
     IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
     registerReceiver(bluetoothListener, filter); 

     gpsListener = new GPSListener(this) { 
      @Override 
      public void onGPSOff() { 
       gpsImg.setImageResource(R.drawable.notok); //not ok 

      } 

      @Override 
      public void onGPSOn() { 
       gpsImg.setImageResource(R.drawable.ok); 
      } 
     }; 

     // Henter fra SharedPrefs 
     SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 
     String savedMobileNumber = prefs.getString("mobilnummer", ""); 
     mobilnummer.setText(savedMobileNumber); 


     final ImageView tlfstatus = (ImageView) findViewById(R.id.tlfstatus); 
     if (mobilnummer.getText().toString().length() >= 8) { 
      tlfstatus.setImageResource(R.drawable.ok); 
     } else { 
      tlfstatus.setImageResource(R.drawable.notok); //not ok 
     } 





     // OnCreate ends here. 
    } 



    public View.OnClickListener onButtongpsClick = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent gpsOptionsIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      startActivity(gpsOptionsIntent); 
     } 
    }; 


    public View.OnClickListener onButtonblueClick = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      BluetoothAdapter mBluetoothAdapter; 
      mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
      if (!mBluetoothAdapter.isEnabled()) mBluetoothAdapter.enable(); 
      ImageView img = (ImageView) findViewById(R.id.bluestatus); 
      img.setImageResource(R.drawable.ok); 
     } 
    }; 
} 

ответ

1

Ответ Сержа - это правда. С Marshmallow (Android 6.0, API Level 23) система permissiom изменилась, и теперь вам нужно позаботиться о устройствах Marshmallow, запросив разрешения во время выполнения. Есть несколько библиотек, которые облегчают процесс.

Easy Permissions является одним из них.

1

См. https://developer.android.com/training/permissions/requesting.html для получения новой политики разрешения и способа запроса разрешений во время выполнения.

+0

Это необходимо, даже если я не нацелен на Api 23 (зефир)? –

+0

Нет, не нужно. Это новая функция, начиная с Marshmallow (Android 6.0, API Level 23). – Serg

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