AndroidはGaode SDKを使用して位置を取得します
Androidの開発プロセスでは、多くの場合、携帯電話の位置を取得する必要があります。ここでは、位置を使用するプロセスを記録します。GaodeのSDKを使用することを選択しました。実際、Web APIはありますが、APIはIPポジショニングを使用し、Android SDKは複数のポジショニングメソッドを使用できます。
記事ディレクトリ
解説
この記事は2020.4.12に更新されました。現時点では、記事のすべてのコンテンツが実践されています。
高いドイツのオープンプラットフォーム
機能のニーズ、私はAndroidポジショニングSDKを使用していますが、他のSDKも同様です。
開発プロセス
Android Studio New Project
新しいプロジェクトを作成し、後で使用するパッケージ名に注意してください。
元のプロジェクトを開く場合は、build.gradleファイルのapplicationidを調整して、パッケージと一致するように注意してください。
ゴールドキーを申請する
自分のアカウントを登録して個々の開発者を申請するのは比較的簡単です
新しいアプリケーション
タイプ選択Android SDK
キーを追加
リリースバージョンのセキュリティコードSHA1、デバッグバージョンのセキュリティコードSHA1、およびパッケージを入力します。
パッケージは、独自のAndroidManifest.xml構成ファイルのパッケージ名と同じです
入力されたSHA1値はローカルSHA1値と一致します(デバッグまたはリリースの少なくとも1つはローカルSHA1と一貫しています)
ローカルSHA1取得方法:
次のコードスニペットをプログラムに追加して、現在のAPKで使用される署名済みファイルSHA1を取得します。
public static String sHA1(Context context){
try {
PackageInfo info = context.getPackageManager().getPackageInfo(
context.getPackageName(), PackageManager.GET_SIGNATURES);
byte[] cert = info.signatures[0].toByteArray();
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] publicKey = md.digest(cert);
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < publicKey.length; i++) {
String appendString = Integer.toHexString(0xFF & publicKey[i])
.toUpperCase(Locale.US);
if (appendString.length() == 1)
hexString.append("0");
hexString.append(appendString);
hexString.append(":");
}
String result = hexString.toString();
return result.substring(0, result.length()-1);
} catch (NameNotFoundException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
アクティビティで呼び出す
String s = sHA1(WeatherActivity.this);//鉴权
Log.e("sHA1:", s);
印刷できます。
記入してください。
Android Studio構成プロジェクト
コピーを介してSDKを統合する
1. jarファイルをlibsフォルダーに
コピーします。ダウンロードしたSDK jarファイルをプロジェクトのlibsディレクトリにコピーします。古いバージョンのjarファイルがある場合は、それを削除してください。ポジショニングSDKでは、ライブラリファイルのサポートは必要ありません。
2.
プロジェクトディレクトリにスイッチを追加し、jarパッケージを右クリックして、[ライブラリとして追加]を選択します。OK
3.デフォルトでbuild.gradleファイルを構成しますbuild.gradleファイル
の依存関係で構成します。
compile fileTree(include: ['*.jar'], dir: 'libs')。
天気の場所を取得
AndroidManifest.xmlを構成する
まず、Serviceコンポーネントを宣言します
アプリケーションタグでサービスコンポーネントを宣言してください。各アプリには独自のポジショニングサービスがあります。
<service android:name="com.amap.api.location.APSService"></service>
次に、権限を宣言します
<!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!--用于写入缓存数据到扩展存储卡-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
最後に、高い道徳的な鍵を設定します
アプリケーションタグを追加します。
<meta-data android:name="com.amap.api.v2.apikey" android:value="key">//开发者申请的key
</meta-data>
初期配置
活動中
//声明AMapLocationClient类对象
public AMapLocationClient mLocationClient = null;
//声明定位回调监听器
public AMapLocationListener mLocationListener = new MyAMapLocationListener();
//声明AMapLocationClientOption对象
public AMapLocationClientOption mLocationOption = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(mLocationListener);
//初始化AMapLocationClientOption对象
mLocationOption = new AMapLocationClientOption();
//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//获取一次定位结果:
//该方法默认为false。
mLocationOption.setOnceLocation(false);
//获取最近3s内精度最高的一次定位结果:
//设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。
//mLocationOption.setOnceLocationLatest(true);
//获取一次定位结果:
//该方法默认为false。
mLocationOption.setOnceLocation(true);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
//关闭缓存机制
mLocationOption.setLocationCacheEnable(false);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
}
private class MyAMapLocationListener implements AMapLocationListener {
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
//此处获得成功,可以参照返回值表取需要的参数,我只要了省市县
Log.e("位置:", aMapLocation.getAddress());
Gprovince = aMapLocation.getProvince();
Gcity = aMapLocation.getCity();
Gdistrict = aMapLocation.getDistrict();
} else {
//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
Log.e("AmapError", "location Error, ErrCode:"
+ aMapLocation.getErrorCode() + ", errInfo:"
+ aMapLocation.getErrorInfo());
}
}
}
}
パラメータの詳細については、公式Webサイトの
エラーコード参照表を参照してください。
最後のステップ、位置決めを停止します
位置決めを停止
mLocationClient.stopLocation();//停止定位后,本地定位服务并不会被销毁
ポジショニングクライアントの破棄ポジショニングクライアントを
破棄した後で、ポジショニングを再度開きたい場合は、新しいAMapLocationClientオブジェクトを作成してください。
mLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务
よくある間違い
Android SDKを使用してGaodeビジネスを呼び出し、INVALID_USER_SCODEを返します
INVALID_USER_SCODE(INVALID_USER_KEYではない)またはエラーコード1008、32、7が返された場合、次のようにして問題を解決できます。
SHA1値を確認する//この記事の「キー値の取得」セクションを参照して
、パッケージ名を確認する
キー値の入力位置
詳しくは公式サイトをご覧ください
バグのないスムーズな開発をお祈りします。