Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android Api级别23中实现融合位置提供程序_Android - Fatal编程技术网

如何在Android Api级别23中实现融合位置提供程序

如何在Android Api级别23中实现融合位置提供程序,android,Android,我试图在我的应用程序中使用融合的位置提供程序获得连续的位置更新,不知怎么的,它在棒棒糖中工作得很好,但在棉花糖中它没有显示任何位置更新 下面是我的代码。请让我知道我做错了什么 public class Gps extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { TextVie

我试图在我的应用程序中使用融合的位置提供程序获得连续的位置更新,不知怎么的,它在棒棒糖中工作得很好,但在棉花糖中它没有显示任何位置更新

下面是我的代码。请让我知道我做错了什么

public class Gps extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {

TextView lati, longi;
LocationRequest lr;
GoogleApiClient mGoogleApiClient;
double latitude = 0, longitude = 0;

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

    lati = (TextView) findViewById(R.id.lati);
    longi = (TextView) findViewById(R.id.longi);

    mGoogleApiClient = new GoogleApiClient.Builder(getApplicationContext())
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();


}

@Override
protected void onStart() {
    super.onStart();

    mGoogleApiClient.connect();
}

@Override
protected void onStop() {
    super.onStop();

    if (mGoogleApiClient.isConnected()) {

        mGoogleApiClient.disconnect();
    }
}

@Override
public void onConnected(@Nullable Bundle bundle) {

    lr = LocationRequest.create();
    lr.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    lr.setInterval(1000);

    if (Build.VERSION.SDK_INT >= 23) {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            requestPermissions(new String[]{

                    Manifest.permission.ACCESS_FINE_LOCATION
            }, 1);

            return;
        }

    }
    else{

        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, lr,this);
    }
}

@Override
public void onLocationChanged(Location location) {

    latitude = location.getLatitude();
    longitude = location.getLongitude();

    Geocoder gc = new Geocoder(Gps.this, Locale.getDefault());

    String locality = null;
    String sub = null;

    try {

        List<Address> addrList;

        addrList = gc.getFromLocation(latitude, longitude, 2);

        if (addrList.size() > 0) {

            Address adr = addrList.get(0);
            locality = adr.getLocality();
            sub = adr.getSubLocality();

            lati.setText(locality);
            longi.setText(sub);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    switch (requestCode) {

        case 2:
            if(){
          }                
           else{

                  }
    }

}
公共类Gps扩展AppCompativeActivity实现GoogleAppClient.ConnectionCallbacks、GoogleAppClient.OnConnectionFailedListener、LocationListener{
文本视图纬度、经度;
位置请求lr;
GoogleapClient MGoogleapClient;
双纬度=0,经度=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gps);
lati=(TextView)findViewById(R.id.lati);
longi=(TextView)findViewById(R.id.longi);
mGoogleApiClient=new-GoogleApiClient.Builder(getApplicationContext())
.addConnectionCallbacks(此)
.addOnConnectionFailedListener(此)
.addApi(LocationServices.API)
.build();
}
@凌驾
受保护的void onStart(){
super.onStart();
mGoogleApiClient.connect();
}
@凌驾
受保护的void onStop(){
super.onStop();
if(mgoogleapClient.isConnected()){
mGoogleApiClient.disconnect();
}
}
@凌驾
未连接的公共无效(@Nullable Bundle){
lr=LocationRequest.create();
lr.setPriority(定位请求。优先级高精度);
lr.设定间隔(1000);
如果(Build.VERSION.SDK_INT>=23){
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予和&ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u LOCATION)!=PackageManager.permission\u已授予){
requestPermissions(新字符串[]){
Manifest.permission.ACCESS\u FINE\u位置
}, 1);
返回;
}
}
否则{
LocationServices.FusedLocationApi.RequestLocationUpdate(mgoogleapClient,lr,this);
}
}
@凌驾
已更改位置上的公共无效(位置){
纬度=位置。getLatitude();
longitude=location.getLongitude();
Geocoder gc=新的地理编码器(Gps.this,Locale.getDefault());
字符串位置=空;
字符串sub=null;
试一试{
列出addrList;
addrList=gc.getFromLocation(纬度,经度,2);
如果(addrList.size()>0){
地址adr=addrList.get(0);
Location=adr.getLocation();
sub=adr.getSubLocality();
lati.setText(地点);
长.长(分);
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
@凌驾
公共空间连接暂停(int i){
}
@凌驾
public void onconnection失败(@NonNull ConnectionResult ConnectionResult){
}
public void onRequestPermissionsResult(int-requestCode,@NonNull-String[]permissions,@NonNull-int[]grantResults){
super.onRequestPermissionsResult(请求代码、权限、授权结果);
开关(请求代码){
案例2:
if(){
}                
否则{
}
}
}

}您没有逻辑在您的
onRequestPermissionsResult
功能中请求位置更新。此外,您仅请求
ACCESS\u FINE\u LOCATION
,而不请求
ACCESS\u rough\u LOCATION
,即使您同时选中了这两个选项

编辑:

onConnected
函数中,当您使用棉花糖或更高版本时,您从不调用
LocationServices.FusedLocationApi.requestLocationUpdates()
。基本上,您只是在这样做:

if (Build.VERSION.SDK_INT >= 23) {
    if (/*No permissions*/) {
        //Request permissions
        return;
    }
    //Location updates are never requested here!!!
}
else {
    //Request location updates
}
当它应该是类似于:

if (Build.VERSION.SDK_INT >= 23) {
    if (/*No permissions*/) {
        //Request permissions
        return;
    }
}
//Request location updates

感谢您告诉我,我现在也添加了对粗略位置的请求,但是如何在onRequestPermissionsResult plz中请求位置更新请告诉我。在该函数中调用
LocationServices.FusedLocationApi.requestLocationUpdates()
。否则,在API 23+中,它永远不会被调用‌​ogleApiClient、lr、this);在OnRequestPermissionResult中,但显示“添加权限检查”错误,但我已经检查了权限。更新了我的答案。这是一个比我在上一篇评论中提到的更好的方法。