2015-05-06 5 views
-1

Я знаю, что это распространенный вопрос, на который были получены ответы несколько раз ... Но я ищу ответ на конкретную проблему. Я написал метод, который требуется для возврата текущего lat/long в качестве строки. Код выглядит следующим образом:Получение текущего местоположения в Android

public class LibraryProvider { 
    public String basicMethod(String string) { 
     String text = string; 
     LocationManager locationManager; 
     String provider; 
     locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 
     Criteria criteria = new Criteria(); 
     provider = locationManager.getBestProvider(criteria, false); 
     Location location = locationManager.getLastKnownLocation(provider); 
     if (location != null) { 
      text = "Provider " + provider + " has been selected."; 
      int lat = (int) (location.getLatitude()); 
      int lng = (int) (location.getLongitude()); 
      text = text + "\n" + "lat: " + String.valueOf(lat); 
      text = text + "\n" + "lng: " + String.valueOf(lng); 
     } else { 
      text = "Location not available"; 
     } 

     return text; 
    } 
} 

Однако андроид студия не позволяет this.get System Service:

не может решить метод getSystemService (java.lang.String)

Я новичок в андроиде и не понимаю контекста и намерений ... Я думаю, что проблема имеет какое-то отношение к этому.

(отредактированный) кода я использую для загрузки выше класса как под

private final class ServiceHandler extends android.os.Handler { 

    public ServiceHandler(Looper looper){ 
     super(looper); 
    } 

    public void handleMessage(Message msg){ 
     dynamicClassLoader(); 
    } 

    String text; 

    private void dynamicClassLoader(){ 

     final String apkFile =Environment.getExternalStorageDirectory().getAbsolutePath()+"/Download/apkFile.apk"; 
     String className = "com.va.android.level2.lib.LibraryProvider"; 
     final File optimisedDexOutputPath = getDir("outdex", 0); 
     DexClassLoader classLoader = new DexClassLoader(apkFile,optimisedDexOutputPath.getAbsolutePath(),null,getClassLoader()); 
     try{ 
      Class loadedClass = classLoader.loadClass(className); 
      // LibraryInterface lib = (LibraryInterface) loadedClass.newInstance(); 
      // lib.basicMethod("hello"); 
      Object obj =(Object)loadedClass.newInstance(); 
      Method method = loadedClass.getMethod("basicMethod", String.class); 
      text = (String) method.invoke(obj,"added method"); 
      showOutput(text); 

     } catch (Exception e){ 
      e.printStackTrace(); 
     } 

    } 

    private void showOutput(final String str){ 
     mServiceHandler.post(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(MyService.this,str, Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 
} 

раньше он работал, но теперь это поднимает некоторые исключения в loadedClass.newInstance(); ..... я думаю, мне нужно передать контекст ... но как ??

+3

вам требуется активность Context эталонным вместо класса. –

+0

ваш класс, не распространяющий какую-либо деятельность, контекст класса неверен. Пожалуйста, расширьте свой класс с помощью Activity – Raghavendra

+0

. Я действительно пытаюсь загрузить этот .apk с помощью DexClassLoader в службу другого приложения –

ответ

0

Для вызова getSystemService (...) необходим контекст. На самом деле вы вызываете его из «этого», который не является классом с контекстом.

1

Попробуйте получить ссылку на Контекст в специализированном конструкторе классов и используйте его;

public class LibraryProvider { 
    private Context context; 
    public LibraryProvider(Context context){ 
     this.context=context; 
    } 
} 

locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
+0

понял, спасибо !! –

+0

@ anantsophia, рад помочь вам, если ans решит проблему ur, которую вы можете принять, чтобы она помогла другим решить ту же проблему. –

+0

, пожалуйста, предложите изменения для отредактированной части вопроса –

0

попробовать это

import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 

LocationListener locationListener = new LocationListener() { 
      public void onLocationChanged(Location location) { 
       // Called when a new location is found by the network location provider. 
       Log.d("DEBUG",location.toString()); 
       double lat = location.getLatitude(); 
       double lon = location.getLongitude(); 
      } 
     }; 
+0

Мне нужно, чтобы lat/longs было только когда я проверяю, а не на locationChange –

+0

Это будет работать, потому что onLocationChanged будет всегда срабатывать. Он также активируется при включении телефона. –

Смежные вопросы