我想通过反向地理编码来检测地址,所以为了实现这一点,我创建了一个名为FetchAddressIntentService的类,它扩展了IntentService,并且还完成了https://developer.android.com/training/location/display-address.html上的所有步骤
调用startIntentService()内的startService(intent)时,抛出异常(如下)
java.lang.RuntimeException:无法实例化服务PACKAGENAME.MainActivity $ FetchAddressIntentService:java.lang.InstantiationException:java.lang.Class PACKAGENAME.MainActivity $ FetchAddressIntentService没有零参数构造函数
在我的AndroidManifest.xml中定义意图服务(下面)
<service
android:name=".MainActivity$FetchAddressIntentService"
android:exported="false"/>
</application>
我的startIntentService方法(如下)
void startIntentService(){
Intent intent = new Intent(this,FetchAddressIntentService.class);
intent.putExtra(FetchAddressIntentService.Constants.RECEIVER,myResultReciever);
intent.putExtra(FetchAddressIntentService.Constants.LOCATION_DATA_EXTRA,lastDetectedLocation);
startService(intent);
}
我的FetchAddressIntentService类(如下)
public class FetchAddressIntentService extends IntentService{
ResultReceiver myReciever;
public FetchAddressIntentService(){
super("Fetching address");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
String errorMessage = "";
//Get the location passed to this serviec thorugh an extra
Location location = intent.getParcelableExtra(Constants.LOCATION_DATA_EXTRA);
List<Address> address = null;
try{
address = geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1);
}
catch(Exception e){
Toast.makeText(this,e.getMessage(), Toast.LENGTH_LONG).show();
}
//Handle the case when there is no location found
if(address == null || address.size() == 0){
Toast.makeText(this, "No address found", Toast.LENGTH_LONG).show();
deliverResulttoReciever(Constants.FAILURE_RESULT,"No address Found");
}
else{
Address currentAddress = address.get(0);
ArrayList<String> addressFragment = new ArrayList<String>();
//Fetch the address lines using getAddressLine
//join them and send them to the thread
for(int i = 0;i<=currentAddress.getMaxAddressLineIndex();i++)
{
addressFragment.add(currentAddress.getAddressLine(i));
}
deliverResulttoReciever(Constants.SUCCESS_RESULT, TextUtils.join(System.getProperty("line.saparator"),addressFragment));
}
}
private void deliverResulttoReciever(int resultCode, String message) {
Bundle bundle = new Bundle();
bundle.putString(Constants.RESULT_DATA_KEY,message);
myReciever.send(resultCode,bundle);
}
public final class Constants {
public static final int SUCCESS_RESULT = 0;
public static final int FAILURE_RESULT = 1;
public static final String PACKAGE_NAME =
"com.google.android.gms.location.sample.locationaddress";
public static final String RECEIVER = PACKAGE_NAME + ".RECEIVER";
public static final String RESULT_DATA_KEY = PACKAGE_NAME +
".RESULT_DATA_KEY";
public static final String LOCATION_DATA_EXTRA = PACKAGE_NAME +
".LOCATION_DATA_EXTRA";
}
}
答案 0 :(得分:1)
试试这个:
将您的服务类更改为静态:
public static class FetchAddressIntentService extends IntentService {
public FetchAddressIntentService(){
super("Fetching address");
}
更多信息请阅读this