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

Instantiation Exception thrown while detecting current address by reverse geocoding

我想通过反向地理编码检测地址,为了实现这一点,我创建了一个名为 FetchAddressIntentService 的 class 扩展 IntentService 并且还完成了 https://developer.android.com/training/location/display-address.html [=15= 上的所有步骤]

调用startIntentService()中的startService(intent)时,抛出异常(如下)

java.lang.RuntimeException: Unable to instantiate service PACKAGENAME.MainActivity$FetchAddressIntentService: java.lang.InstantiationException: java.lang.Class PACKAGENAME.MainActivity$FetchAddressIntentService has no zero argument constructor

在我的 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 class(下)

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";
    }
}

试试这个:

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

 public static class FetchAddressIntentService extends IntentService {

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

           }

更多信息阅读this