Forum > Android
How can translate this java code: public interface AMapLocationListener{}
(1/1)
iwizard:
I want to create a new lamw component, and when I use the tools provided by LAMW to import the jar, I am told that the interface cannot be imported, but the sample code of this jar indicates that I want to use the class inherited from the interface to complete the code like an event callback:
java code:
--- Code: Java [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---public interface AMapLocationListener { void onLocationChanged(AMapLocation var1);}
--- Code: Java [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---AMapLocationListener locationListener = new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation location) { if (null != location) { StringBuffer sb = new StringBuffer(); if(location.getErrorCode() == 0){ sb.append("Longitude : " + location.getLongitude() + "\n"); sb.append("Latitude : " + location.getLatitude() + "\n"); sb.append("Accuracy : " + location.getAccuracy() + "meter" + "\n"); String result = sb.toString(); tvResult.setText(result); } else { tvResult.setText("locate error,loc is null"); } }};
How do I translate the Java interface and its implementation classes into FreePascal? Please help me, thank you very much!
Oh yes, I used the tool under delphi to get the translation code for the interface, but it can't be used directly under freepascal:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---JAMapLocationListenerClass = interface(JObjectClass) ['{67513425-8988-4FE6-974B-41C46793B470}'] { static Property Methods } { static Methods } { static Property } end; [JavaSignature('com/amap/api/location/AMapLocationListener')] JAMapLocationListener = interface(IJavaInstance) ['{03B66EBC-1491-4DAB-BB09-CDD59D99272B}'] { Property Methods } { methods } procedure onLocationChanged(P1: JAMapLocation); cdecl; { Property } end; TJAMapLocationListener = class(TJavaGenericImport<JAMapLocationListenerClass, JAMapLocationListener>) end;
The attachment is the jar file I want to import.
jmpessoa:
What is the link to the original java use/example?
iwizard:
Thank you for your reply. The instance code is as follows, please refer to the "initLocation()" method:
demo download url : https://pan.baidu.com/s/1elevPfZAKC7FkIF9ZMKklg?pwd=mhex
--- Code: Java [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---package com.amap.location.demo; import android.annotation.SuppressLint;import android.app.Notification;import android.app.NotificationChannel;import android.app.NotificationManager;import android.content.Context;import android.graphics.Color;import android.os.Bundle;import android.text.TextUtils;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.RadioGroup;import android.widget.RadioGroup.OnCheckedChangeListener;import android.widget.TextView; import com.amap.api.location.AMapLocation;import com.amap.api.location.AMapLocationClient;import com.amap.api.location.AMapLocationClientOption;import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;import com.amap.api.location.AMapLocationClientOption.AMapLocationProtocol;import com.amap.api.location.AMapLocationListener;import com.amap.api.location.AMapLocationQualityReport; /** * Created by hongming.wang on 2018/1/29. * 后台定位示例 * <p> * 从Android 8.0开始,Android系统为了实现低功耗,Android 8.0系统对后台应用获取位置的频率进行了限制,只允许每小时几次位置更新。 * 根据Android 8.0的开发指引,为了适配这一系统特性, * 高德定位SDK从8.0开始增加了两个新接口enableBackgroundLocation和disableBackgroundLocation用来控制是否开启后台定位。 * 开启后sdk会生成一个前台服务通知,告知用户应用正在后台运行,使得开发者自己的应用退到后台的时候,仍有前台通知在,提高应用切入后台后位置更新的频率。 * 如果您的应用在退到后台时本身就有前台服务通知,则无需按照本示例的介绍做适配。<br> * 示例中提供了两种方法启动和关闭后台定位功能,请根据业务场景进行相应的修改<br> * 1、通过按钮触发,点击按钮调用相应的接口开开启或者关闭后台定位,此种方法主要是更直观的展示后台定位的功能 * 2、通过生命周期判断APP是否处于后台,当处于后台时才开启后台定位功能,恢复到前台后关闭后台定位功能 * </p> */public class Location_BackGround_Activity extends CheckPermissionsActivity implements OnClickListener{ private TextView tvResult; private Button btLocation; private Button btEnableBackgroundLocation; private Button btDisableBackgroundLocation; private AMapLocationClient locationClient = null; private AMapLocationClientOption locationOption = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_location_background); setTitle(R.string.title_locationBackground); initView(); initLocation(); } @Override protected void onResume() { super.onResume(); //切入前台后关闭后台定位功能 if(null != locationClient) { locationClient.disableBackgroundLocation(true); } } @Override protected void onStop() { super.onStop(); boolean isBackground = ((MyApplication)getApplication()).isBackground(); //如果app已经切入到后台,启动后台定位功能 if(isBackground){ if(null != locationClient) { locationClient.enableBackgroundLocation(2001, buildNotification()); } } } @Override protected void onPause() { super.onPause(); } //初始化控件 private void initView(){ tvResult = (TextView) findViewById(R.id.tv_result); btLocation = (Button) findViewById(R.id.bt_location); btEnableBackgroundLocation = (Button) findViewById(R.id.bt_enableBackground); btDisableBackgroundLocation = (Button) findViewById(R.id.bt_disableBackground); btLocation.setOnClickListener(this); btEnableBackgroundLocation.setOnClickListener(this); btDisableBackgroundLocation.setOnClickListener(this); } @Override protected void onDestroy() { super.onDestroy(); destroyLocation(); } @Override public void onClick(View v) { if (v.getId() == R.id.bt_location) { if (btLocation.getText().equals( getResources().getString(R.string.startLocation))) { btLocation.setText(getResources().getString( R.string.stopLocation)); tvResult.setText("正在定位..."); startLocation(); } else { btLocation.setText(getResources().getString( R.string.startLocation)); stopLocation(); tvResult.setText("定位停止"); } } if(v.getId() == R.id.bt_enableBackground){ if(null == locationClient){ try { locationClient = new AMapLocationClient(this); //启动后台定位 locationClient.enableBackgroundLocation(2001, buildNotification()); } catch (Exception e) { e.printStackTrace(); } } } if(v.getId() == R.id.bt_disableBackground){ if(null == locationClient){ try { locationClient = new AMapLocationClient(this); //关闭后台定位 locationClient.disableBackgroundLocation(true); } catch (Exception e) { e.printStackTrace(); } } } } /** * 初始化定位 * * @since 2.8.0 * @author hongming.wang * */ private void initLocation(){ //初始化client try { locationClient = new AMapLocationClient(this.getApplicationContext()); locationOption = getDefaultOption(); //设置定位参数 locationClient.setLocationOption(locationOption); // 设置定位监听 locationClient.setLocationListener(locationListener); } catch (Exception e) { e.printStackTrace(); } } /** * 默认的定位参数 * @since 2.8.0 * @author hongming.wang * */ private AMapLocationClientOption getDefaultOption(){ AMapLocationClientOption mOption = new AMapLocationClientOption(); mOption.setLocationMode(AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式 mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭 mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效 mOption.setInterval(2000);//可选,设置定位间隔。默认为2秒 mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true mOption.setOnceLocation(false);//可选,设置是否单次定位。默认是false mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用 AMapLocationClientOption.setLocationProtocol(AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP mOption.setSensorEnable(false);//可选,设置是否使用传感器。默认是false mOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差 mOption.setLocationCacheEnable(true); //可选,设置是否使用缓存定位,默认为true return mOption; } /** * 定位监听 */ AMapLocationListener locationListener = new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation location) { if (null != location) { StringBuffer sb = new StringBuffer(); //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明 if(location.getErrorCode() == 0){ sb.append("定位成功" + "\n"); sb.append("定位类型: " + location.getLocationType() + "\n"); sb.append("经 度 : " + location.getLongitude() + "\n"); sb.append("纬 度 : " + location.getLatitude() + "\n"); sb.append("精 度 : " + location.getAccuracy() + "米" + "\n"); sb.append("提供者 : " + location.getProvider() + "\n"); sb.append("速 度 : " + location.getSpeed() + "米/秒" + "\n"); sb.append("角 度 : " + location.getBearing() + "\n"); // 获取当前提供定位服务的卫星个数 sb.append("星 数 : " + location.getSatellites() + "\n"); sb.append("国 家 : " + location.getCountry() + "\n"); sb.append("省 : " + location.getProvince() + "\n"); sb.append("市 : " + location.getCity() + "\n"); sb.append("城市编码 : " + location.getCityCode() + "\n"); sb.append("区 : " + location.getDistrict() + "\n"); sb.append("区域 码 : " + location.getAdCode() + "\n"); sb.append("地 址 : " + location.getAddress() + "\n"); sb.append("地 址 : " + location.getDescription() + "\n"); sb.append("兴趣点 : " + location.getPoiName() + "\n"); //定位完成的时间 sb.append("定位时间: " + Utils.formatUTC(location.getTime(), "yyyy-MM-dd HH:mm:ss") + "\n"); } else { //定位失败 sb.append("定位失败" + "\n"); sb.append("错误码:" + location.getErrorCode() + "\n"); sb.append("错误信息:" + location.getErrorInfo() + "\n"); sb.append("错误描述:" + location.getLocationDetail() + "\n"); } sb.append("***定位质量报告***").append("\n"); sb.append("* WIFI开关:").append(location.getLocationQualityReport().isWifiAble() ? "开启":"关闭").append("\n"); sb.append("* GPS状态:").append(getGPSStatusString(location.getLocationQualityReport().getGPSStatus())).append("\n"); sb.append("* GPS星数:").append(location.getLocationQualityReport().getGPSSatellites()).append("\n"); sb.append("****************").append("\n"); //定位之后的回调时间 sb.append("回调时间: " + Utils.formatUTC(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss") + "\n"); //解析定位结果, String result = sb.toString(); tvResult.setText(result); } else { tvResult.setText("定位失败,loc is null"); } } }; /** * 获取GPS状态的字符串 * @param statusCode GPS状态码 * @return */ private String getGPSStatusString(int statusCode){ String str = ""; switch (statusCode){ case AMapLocationQualityReport.GPS_STATUS_OK: str = "GPS状态正常"; break; case AMapLocationQualityReport.GPS_STATUS_NOGPSPROVIDER: str = "手机中没有GPS Provider,无法进行GPS定位"; break; case AMapLocationQualityReport.GPS_STATUS_OFF: str = "GPS关闭,建议开启GPS,提高定位质量"; break; case AMapLocationQualityReport.GPS_STATUS_MODE_SAVING: str = "选择的定位模式中不包含GPS定位,建议选择包含GPS定位的模式,提高定位质量"; break; case AMapLocationQualityReport.GPS_STATUS_NOGPSPERMISSION: str = "没有GPS定位权限,建议开启gps定位权限"; break; } return str; } /** * 开始定位 * * @since 2.8.0 * @author hongming.wang * */ private void startLocation(){ try { // 设置定位参数 locationClient.setLocationOption(locationOption); // 启动定位 locationClient.startLocation(); } catch (Exception e) { e.printStackTrace(); } } /** * 停止定位 * * @since 2.8.0 * @author hongming.wang * */ private void stopLocation(){ try { // 停止定位 locationClient.stopLocation(); } catch (Exception e) { e.printStackTrace(); } } @Override public void onBackPressed() { super.onBackPressed(); } /** * 销毁定位 * * @since 2.8.0 * @author hongming.wang * */ private void destroyLocation(){ if (null != locationClient) { /** * 如果AMapLocationClient是在当前Activity实例化的, * 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy */ locationClient.onDestroy(); locationClient = null; locationOption = null; } } private void createNotificationChannel(){ } private static final String NOTIFICATION_CHANNEL_NAME = "BackgroundLocation"; private NotificationManager notificationManager = null; boolean isCreateChannel = false; @SuppressLint("NewApi") private Notification buildNotification() { Notification.Builder builder = null; Notification notification = null; if(android.os.Build.VERSION.SDK_INT >= 26) { //Android O上对Notification进行了修改,如果设置的targetSDKVersion>=26建议使用此种方式创建通知栏 if (null == notificationManager) { notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); } String channelId = getPackageName(); if(!isCreateChannel) { NotificationChannel notificationChannel = new NotificationChannel(channelId, NOTIFICATION_CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); notificationChannel.enableLights(true);//是否在桌面icon右上角展示小圆点 notificationChannel.setLightColor(Color.BLUE); //小圆点颜色 notificationChannel.setShowBadge(true); //是否在久按桌面图标时显示此渠道的通知 notificationManager.createNotificationChannel(notificationChannel); isCreateChannel = true; } builder = new Notification.Builder(getApplicationContext(), channelId); } else { builder = new Notification.Builder(getApplicationContext()); } builder.setSmallIcon(R.drawable.ic_launcher) .setContentTitle(Utils.getAppName(this)) .setContentText("正在后台运行") .setWhen(System.currentTimeMillis()); if (android.os.Build.VERSION.SDK_INT >= 16) { notification = builder.build(); } else { return builder.getNotification(); } return notification; } }
Navigation
[0] Message Index