2016-11-30 2 views
0

아래 프로그램을 작성하고 컴파일하고 실행했습니다. 의도 한 목적은 textView에 속도를 표시하는 것으로서 내가 할 수있는 한 작동하지 않습니다. 내 휴대 전화에서 실행하지 못했습니다. 두 개의 위치 출력 변수, speedourSpe이 있습니다. 왜냐하면 ourSpe은 내가 본 YouTube 동영상에서 왔고 작동하지 않았기 때문이며 speed은 조회 한 스택 오버플로 질문에서 나옵니다. 둘 다 도움이되었지만 결과를 얻지 못하고 나는 엉덩이를 인쇄한다. 버튼 spedButt을 누른다. 나는 방금 잘못된 순서로 코드를 작성했다고 생각하지만 내가 LocationManager을 올바르게 사용하고 있는지 확실하지 않습니다.LocationListener 및 LocationManager를 사용하는 Android 스튜디오 프로젝트가 실행되지 않는 것 같습니다

레이아웃 파일은 RelativelayouttextViewsButton 두 개만 있지만 스택 오버플로가 계속해서 오류를 발생시키고 그 중 하나를 파악할 수 없습니다. 나는 나쁜 하루 보내고있다. 내 자신의 질문에 대답

홈페이지 코드

package com.example.vitaliy_2.safespeedalert; 

    import android.Manifest; 
    import android.content.Context; 
    import android.content.pm.PackageManager; 
    import android.location.Location; 
    import android.location.LocationListener; 
    import android.location.LocationManager; 
    import android.os.Bundle; 
    import android.support.v4.app.ActivityCompat; 
    import android.support.v7.app.AppCompatActivity; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.TextView; 



    public class SpeedTest extends AppCompatActivity implements LocationListener { 
      TextView txt; 
      TextView txt_2; 
      Button spedButt; 
      float curSpe; 
      float speed; 
      Location l; 
      Location mLastLocation; 
      Location pCurrentLocation; 

    @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_speed_test); 



     txt = (TextView) findViewById(R.id.speed_display); 
      txt_2 = (TextView) findViewById(R.id.speed_display_2); 
      spedButt = (Button) findViewById(R.id.spedButt); 
      speed = 0; 

     LocationManager lm = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE); 

      if (ActivityCompat.checkSelfPermission(this, 
Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, 
Manifest.permission.ACCESS_COARSE_LOCATION) !=PackageManager.PERMISSION_GRANTED) {return;} 
      lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
      this.onLocationChanged(null); 

     } 



     @Override 
     public void onLocationChanged(final Location location) { 
      l = location; 
      if (this.mLastLocation != null) 
       speed = (float)Math.sqrt(
         Math.pow(pCurrentLocation.getLongitude() - mLastLocation.getLongitude(), 2) 
           + Math.pow(pCurrentLocation.getLatitude() - mLastLocation.getLatitude(), 2) 
       )/(pCurrentLocation.getTime() - this.mLastLocation.getTime()); 
      this.mLastLocation = pCurrentLocation; 



      spedButt.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View v) { 
        if(l == null){ 
         txt.setText("-.- m/s"); 
         txt_2.setText("-.- m/s"); 

        }else{ 
         if (pCurrentLocation.hasSpeed()) 


    speed = pCurrentLocation.getSpeed(); 
        curSpe = location.getSpeed(); 

        String sent = speed + "m/s"; 
        txt.setText(sent); 
        String sentTwo = curSpe + "m/s"; 
        txt_2.setText(sentTwo); 
       } 
      } 
     }); 

    } 
+0

위치 권한을 요청 했습니까 ?? https://developer.android.com/training/permissions/requesting.html – Budius

+0

예 @Budius. 나는 매니 페스트와 함께 게시 한 코드에 있습니다. 대화가 결코 터지지 않았지만 프로그램이 결코 런타임 오류를 게임하지 않는다는 것을 알게되었습니다. –

+0

게시 한 코드는 IF가 실패하면 요청해야하는 권한 (r은 분명히 알지 못함)이 있는지 확인하는 경우에만 검사합니다. 나는 여기서 당신을 위해 글을 쓸 시간이 없지만, 문서를 다시 확인해 보면 분명히 그것을 놓치고 있습니다. – Budius

답변

0

는,이 코드는 자동으로 팝업하지만 여전히 허가를 요청하는 조항이있을 필요가있다.

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 


     ActivityCompat.requestPermissions(this, 
       new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1); 


     return; 
    }else{ 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, this); 
    } 
    this.onLocationChanged(null);