だから私はGoogleApiClientについて私にはあまり明確ではない何かを見つけました。 GoogleApiClientにはonConnectedという関数があり、クライアントがconnected(確かに)
私は自分の関数を呼び出しました:startLocationListening最終的にGoogleApiClientのonConnected 関数。
したがって、私のstartLocationListening関数は、GoogleApiClient接続なしで実行できませんでした。
コードとログ:
@Override
public void onConnected(Bundle bundle) {
log("Google_Api_Client:connected.");
initLocationRequest();
startLocationListening(); //Exception caught inside this function
}
...
private void startLocationListening() {
log("Starting_location_listening:now");
//Exception caught here below:
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
例外は次のとおりです:
03-30 12:23:28.947: E/AndroidRuntime(4936): Java.lang.IllegalStateException: GoogleApiClient is not connected yet.
03-30 12:23:28.947: E/AndroidRuntime(4936): at com.google.Android.gms.internal.jx.a(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936): at com.google.Android.gms.common.api.c.b(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936): at com.google.Android.gms.internal.nf.requestLocationUpdates(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936): at hu.company.testproject.service.GpsService.startLocationListening(GpsService.Java:169)
03-30 12:23:28.947: E/AndroidRuntime(4936): at hu.company.testproject.service.GpsService.onConnected(GpsService.Java:259)
...
私のデバッグログには、onConnected関数が呼び出されたと書かれています:
03-30 12:23:28.847: I/Locationing_GpsService(4936): Google_Api_Client:connected.
03-30 12:23:28.857: I/Locationing_GpsService(4936): initLocationRequest:initing_now
03-30 12:23:28.877: I/Locationing_GpsService(4936): initLocationRequest:interval_5000
03-30 12:23:28.897: I/Locationing_GpsService(4936): initLocationRequest:priority_100
03-30 12:23:28.917: I/Locationing_GpsService(4936): Starting_location_listening:now
この後、私は例外を得ました。
ここに何かが足りませんか? 「接続」に対する応答があり、funcを実行しましたが、「接続されていません」というエラーが表示されました。さらに、厄介な点は、このロケーションサービスを数週間使用していて、このエラーが発生しなかったことです。
E D I T:
より具体的なログ出力を追加しましたが、思いついたのでこれをチェックしてください:
@Override
public void onConnected(Bundle bundle) {
if(mGoogleApiClient.isConnected()){
log("Google_Api_Client: It was connected on (onConnected) function, working as it should.");
}
else{
log("Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged.");
}
initLocationRequest();
startLocationListening();
}
この場合のログ出力:
03-30 16:20:00.950: I/Locationing_GpsService(16608): Google_Api_Client:connected.
03-30 16:20:00.960: I/Locationing_GpsService(16608): Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged.
はい、mGoogleApiClient.isConnected() == false
の中にonConnected()
とあります。どうすれば可能ですか?
E D I T:
評判に恵まれてもこれに答えることができないため、iはバグとしてこれをGoogleに報告することにしました。次に来たのは本当に驚きました。私の報告に対するGoogleの公式回答:
「このウェブサイトは、AOSP Androidソースコードと開発者ツールセットに関する開発者の問題のためのものであり、GoogleアプリやPlayサービス、GMS、Google APIなどのサービスではありません。残念ながら適切な場所はないようですPlay Servicesのバグを報告します。私が言えるのは、このWebサイトはそうではないということです。申し訳ありません。代わりにGoogleプロダクトフォーラムに投稿してみてください。
完全な問題 ここに報告してください (ばかげているからといって削除しないことを願っています)
だから、私はGoogleプロダクトフォーラムを見て、このことを投稿するトピックを見つけただけなので、今のところIamは困惑して立ち往生しています。
惑星地球の誰もがこれで私を助けることができますか?
E D I T:
Pastebin の完全なコード
OnStartCommand()でgoogleApiClientを作成していることに気付きました。これは悪い考えのようです。
サービスが2回トリガーされたとしましょう。 2つのgoogleApiClientオブジェクトが作成されますが、参照できるのは1つだけです。参照を持たないものがonConnected()へのコールバックを実行する場合、そのクライアントで接続されますが、実際に参照を持っているクライアントはまだ接続されていない可能性があります。
私はそれが起こっているのではないかと思う。 googleApiClientの作成をonCreateに移動して、同じ動作をするかどうかを確認してください。
同じエラーが発生しましたが、私の問題はiheanylの答えとは異なりました。
GoogleApiClient静的を宣言しました。これにより、Androidがサービスをシャットダウンできなくなりました。
私はこの問題を抱えており、googleApiClientを静的オブジェクトとして宣言することで解決しました
私は問題の根本を見つけたと思いますが、それはAPIとは何の関係もありません。アプリをインストールするたびにこの問題が発生しました。ちなみに、最も人気のあるコメントのように、一時停止と再開時にgoogleApiClientは1つしかありません。私が気づいたのは、位置情報アクセスを取得するための許可リクエストがポップアップすることです。アクティビティでわかるように、これは一時停止に変わり、ポップアップが消えるとアクティビティが再開されます。ほとんどの場合、googleClientもこれらのイベントにチェーンされ、切断および接続されます。許可が受け入れられ、googleApiClientタスクを実行しようとすると、接続が存在しないことがわかります。
if(googleApiClient.isConnected()){
rxPermissions
.request(Manifest.permission.ACCESS_FINE_LOCATION)
.subscribe(granted -> {
if (granted) {
//here it could be client is already disconnected!!
_geolocateAddress(response);
} else {
// Oups permission denied
}
});
}
許可前にgoogleApiClientタスクが完了するかgranted
がfalseになるフラグを設定すると、切断と接続をスキップできます。
if(googleApiClient.isConnected()){
isRequestingPermission = true;
rxPermissions
.request(Manifest.permission.ACCESS_FINE_LOCATION)
.subscribe(granted -> {
if (granted && googleApiClient.isConnected()) {
//Once the task succeeds or fails set flag to false
//at _geolocateAddress
_geolocateAddress(response);
} else {
// Oups permission denied
isRequestingPermission = false;
}
});
}
また、許可を単独で行うことを分割し、許可された場合はタスク呼び出しを行うこともできます。フラグメントを使用していることを告白します。アプリを再インストールすると、権限で画面が回転し、一度許可されると結果が表示されました。これが他の人に役立つことを願っています。
https://developer.Android.com/reference/com/google/Android/gms/common/api/GoogleApiClient.html
アクティビティのonCreate(Bundle)メソッドでクライアントオブジェクトをインスタンス化し、状態に関係なく、onStart()でconnect()およびonStop()でdisconnect()を呼び出す必要があります。
GoogleApiClientの実装は、単一のインスタンス専用に設計されているようです。 onCreateでインスタンス化するのは一度だけにしてから、単一のインスタンスを使用して接続と切断を実行するのが最善です。
onStart()メソッドでconnect()メソッドを呼び出す
@Override
protected void onStart() {
super.onStart();
// Call GoogleApiClient connection when starting the Activity
googleApiClient.connect();
}
@Override
protected void onStop() {
super.onStop();
// Disconnect GoogleApiClient when stopping Activity
googleApiClient.disconnect();
}