2016-10-27 92 views
0

好日子獲取GPS座標工作仿真器,而不是設備

我創造了我的計算機科學項目輔導程序和我有獲取GPS定位的問題。正如我的標題所述,它完美適用於模擬器(Toasts位置以及寫入數據庫),但在我的手機或其他設備上,我嘗試過它甚至沒有Toast,這意味着它甚至不會進入課堂。我環顧四周,但無法找到解決方案。

繼承人我類的getLocation:

package com.example.tutor; 

import android.Manifest; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.v4.app.ActivityCompat; 
import android.widget.Toast; 

import static android.content.Context.LOCATION_SERVICE; 

/** 
* Created by admin on 03-Oct-16. 
*/ 


public class GetLocation2 { 

    private LocationManager locationManager; 
    private LocationListener locationListener; 
    Activity parent; 
    String TutorStudentID; 
    int status; 


    public GetLocation2(Activity par, String tsi, int i) { 

     parent = par; 
     TutorStudentID = tsi; 
     final int[] count = {0}; 
     status = i; 

     locationManager = (LocationManager) parent.getSystemService(LOCATION_SERVICE); 
     locationListener = new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       // txtLocation.append("\n " + location.getLatitude() + " "+ location.getLongitude()); 
       if (count[0] == 0) { 

        if (status == 0) { 
         Toast.makeText(parent.getApplicationContext(), "Lat: " + location.getLatitude() + " Long: " + location.getLongitude(), Toast.LENGTH_SHORT).show(); 
         tutor_checkin connect2server = new tutor_checkin(parent, TutorStudentID, "Lat: " + location.getLatitude() + " Long: " + location.getLongitude()); 
         connect2server.execute(); 
        } 
        if (status == 1) { 
         Toast.makeText(parent.getApplicationContext(), "Lat: " + location.getLatitude() + " Long: " + location.getLongitude(), Toast.LENGTH_SHORT).show(); 
         tutor_checkout connect2server1 = new tutor_checkout(parent, TutorStudentID, "Lat: " + location.getLatitude() + " Long: " + location.getLongitude()); 
         connect2server1.execute(); 
        } 

        count[0]++; 
       } 

       Toast.makeText(parent.getApplicationContext(), "Lat: " + location.getLatitude() + " Long: " + location.getLongitude(), Toast.LENGTH_SHORT).show(); 


      } 

      @Override 
      public void onStatusChanged(String s, int i, Bundle bundle) { 

      } 

      @Override 
      public void onProviderEnabled(String s) { 
       // onLocationChanged(); 


      } 

      @Override 
      public void onProviderDisabled(String s) { 
       Intent intent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       parent.startActivity(intent); 



      } 
     }; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 

      if (ActivityCompat.checkSelfPermission(parent, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(parent, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

       parent.requestPermissions(new String[]{ 
           Manifest.permission.ACCESS_FINE_LOCATION, 
           Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.INTERNET} 
         , 10); 
       return; 
      } 
     } else { 

      // if(count ==0) { 
      locationManager.requestLocationUpdates("gps", 5000, 0, locationListener); 


      // count++ ; 
      // } 

      // configureButton(); 
      // btnLocation.performClick(); 
      // locationManager.requestLocationUpdates("gps", 5000, 0, locationListener); 

     } 

    } 

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     // super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     // int count = 0 ; 
     switch (requestCode) { 
      case 10: 
       // if(count == 0) { 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        if (ActivityCompat.checkSelfPermission(parent.getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(parent.getApplicationContext(), 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; 
        } 
        locationManager.requestLocationUpdates("gps", 5000, 0, locationListener); 
         // count++; 

        } 
       //} 


       // configureButton(); 
     } 

    } 

} 

繼承人在那裏我是從調用它(它從CardViewAdapter)

eventViewHolder.Checkin.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       String sText = eventViewHolder.Checkin.getText().toString() ; 



       if(sText.toString().equals("Check in")) 
       { 
        eventViewHolder.Checkin.setText("Check out"); 
        new GetLocation2(H, Sessions.get(i).sessionID,0); 



       } 
}); 
+0

您的手機正在運行什麼版本?您必須明確處理Marshmallow中某些權限的權限請求+ – zgc7009

+0

經測試的API 17和23.當您明確表示您的意思是什麼? – Nivek

+0

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

回答

0

也許你錯過了'uses-permission' declaration in the AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 

由於requesting permissions文檔中描述的那樣,

在Android上的所有版本,應用程序需要聲明正常和在其應用程序清單需要危險的權限,如在聲明權限。但是,該聲明的效果取決於系統版本和應用的目標SDK級別:

如果設備運行的是Android 5.1或更低版本,或者您的應用的目標SDK爲22或更低:如果列出危險清單中的權限,用戶必須在安裝應用程序時授予權限;如果他們沒有授予權限,系統根本不會安裝該應用程序。

如果設備運行的是Android 6.0或更高版本,並且您的應用的目標SDK爲23或更高:應用必須列出清單中的權限,並且它必須在應用運行時請求所需的每個危險權限。用戶可以授予或拒絕每個權限,並且即使用戶拒絕權限請求,應用也可以繼續以有限的功能運行。

+0

是的,我已經添加到清單 – Nivek

+1

當我點擊「檢查」按鈕,它確實請求接受權限,接受後,沒有任何反應 – Nivek

0

嘗試使用:的

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, locationListener); 

代替:

locationManager.requestLocationUpdates("gps", 5000, 0, locationListener); 

請問手機有一個修復?它可以從GPS定位?請嘗試使用外部應用程序所以你確定GPS可以解決問題。位置服務是否在手機上啓用?

除了要求運行時權限,還需要將權限添加到清單文件。

+0

不幸的是,行沒有幫助。是的,所有權限以及位置服務都已啓用。權限也在清單(課程和罰款位置)。令人困惑的是,它甚至沒有顯示onLocationChanged中的Toast。在模擬器上,如果它沒有設置位置,但它在設備上沒有任何設置,但它沒有任何設置 – Nivek

0

問題是,如果你有onRequestPermissionsResult()方法,它不會覆蓋超類中的任何方法,所以它永遠不會被調用。

此方法重寫需要進入活動。

爲方法重寫使用@Override註釋是一種很好的做法。 如果你把一個超過onRequestPermissionsResult(),你擁有它現在,你應該看到這樣的事情:

enter image description here

爲了解決這個問題,首先要創建一個實例變量,以保持GetLocation2參考的軌跡:

public class MainActivity extends AppCompatActivity { 

    GetLocation2 getLoc2; 
    //............ 

然後分配getLoc2參考:

eventViewHolder.Checkin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String sText = eventViewHolder.Checkin.getText().toString() ; 
      if(sText.toString().equals("Check in")) 
      { 
       eventViewHolder.Checkin.setText("Check out"); 
       getLoc2 = new GetLocation2(H, Sessions.get(i).sessionID,0); 
      } 
     }); 

隨後onRequestPermissionsResult()方法移至活動,和而不是直接調用requestLocationUpdates(),叫你將在GetLocation2類中定義一個新的公共方法:

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case 10: 

      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
         && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
        return; 
       } 

       if (getLoc2 != null) { 
        getLoc2.requestLocations(); 
       } 
      } 
    } 
} 

最後,在GetLocation2類定義getLocations()方法:

public void requestLocations() { 

    if (ActivityCompat.checkSelfPermission(parent, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
      || ActivityCompat.checkSelfPermission(parent, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     return; 
    } 

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,5000,0,locationListener); 
} 
+0

美好的一天非常感謝您的回覆,我覺得我們現在快到了,但是有一個問題,我打電話給get Location函數在Cardview適配器中添加OnRequestPermissionResult(帶有@Override)給出了與上面顯示的相同的錯誤,我從HomeFragment調用CardViewAdapter,我嘗試通過getLoc2從Fragment發送到適配器,但是沒有任何反應,不要從模擬器吐司 – Nivek

相關問題