通过反向地理编码检测当前地址时抛出实例化异常

时间:2017-04-17 07:41:04

标签: android exception geolocation intentservice reverse-geocoding

我想通过反向地理编码来检测地址,所以为了实现这一点,我创建了一个名为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";
    }
}

1 个答案:

答案 0 :(得分:1)

试试这个:

将您的服务类更改为静态:

 public static class FetchAddressIntentService extends IntentService {

        public FetchAddressIntentService(){
            super("Fetching address");

           }

更多信息请阅读this