2011-06-14 4 views
0

내 앱에는 GPS 위치가있는 일부 개체가 있습니다. 현재 그들과 함께 할 수있는 유일한 일은지도에 표시하는 것 뿐이지 만 사용자 위치를 알아야하는 다른 기능을 구현할 계획입니다. 일부 사용자는 이러한 기능을 사용하고 싶지 않기 때문에 앱에 위치 권한을 추가하고 싶지 않습니다.너무 많은 권한 요청을 피하기 위해 플러그인에서 시스템 서비스 공유

제 아이디어는 플러그인 만 위치 정보를 제공하는 별도의 apk (일종의 플러그인)를 사용하여 플러그인 만 위치 권한을 요청해야한다는 것입니다.

메인 애플리케이션이 플러그인의 LocationManager를 사용할 수 있도록 호환되지 않는 인터페이스가있는 맞춤 서비스를 만들지 않고 직접 플러그인을 사용하여 시스템 서비스 (LocationManager)를 공유 할 수 있습니까? 이렇게하면 MyLocationOverlay 또는 다른 클래스와 같은 기존 클래스를 사용할 수 있습니다. 주요 응용 프로그램은 다음과 같이 이러한 클래스에 ContextWrapper을 전달할 수 :

public static class LocationContext extends ContextWrapper { 

    public LocationContext(Context base) { 
     super(base); 
    } 

    @Override 
    public Object getSystemService(String name) { 
     if (name.equals(LOCATION_SERVICE)) { 
      // Return the LocationManager service of the plugin here... 
     } 
     return super.getSystemService(name); 
    } 

} 

답변

2

질문을 잘 이해하고 있는지 잘 모르겠지만 한 응용 프로그램에서 다른 응용 프로그램의 클래스를로드하여 프로세스 경계를 ​​넘을 수는 없습니다. 핵심은 두 APS에 대한 매니페스트에서 동일한 android : process 및 android : sharedUserId 속성을 사용하고 있습니다. 그러면 앱은 기기의 동일한 Linux 프로세스에서 실행됩니다. 리플렉션 API를 사용하여 프로그래밍 방식으로 App A의 클래스를 App B에서로드하거나 그 반대로로드 할 수 있습니다. App A가 이미 Market에 있다면, 아마도 process와 sharedUserId 속성을 추가하는 새 버전을 릴리스해야하고, App B를 동일한 속성으로 해제해야합니다.

+0

재미있을 것 같습니다. 두 APK 모두 동일한 프로세스와 sharedUserId를 가지고 있다고 가정하면 주 앱이 LocationManager를 가져올 수있는 방법을 보여줄 수 있습니까? – Tom

+0

필자는 테스트 한 것보다 훨씬 쉽습니다. 빈 프로젝트를 만들었고 android : sharedUserId와 android : 프로세스를 내 메인 앱의 패키지 이름으로 설정하고 plugins AndroidManifest.xml에 uses-permission 태그를 추가했습니다. 이제 기본 응용 프로그램은 플러그인에 정의 된 모든 권한을 가지며 사용자 위치를 가져올 수있었습니다. 따라서이 방법은 플러그인에서 한 줄의 코드가 필요하지 않습니다. – Tom

+0

Google은 권장하지 않습니다. http://stackoverflow.com/questions/6354035/two-android-applications-with-same-user-id/6354073#6354073 또한 애플리케이션 A 권장 사항이 재발행 된 경우 결함이있는 것으로 입증되었습니다. 새로운 응용 프로그램 A는 더 이상 원래 사용자 ID로 저장 한 파일에 액세스 할 수 없으므로 - 적어도 Android 2.x 시리즈를 통해 - Android는 사용자 ID가 변경 될 때 자동으로 파일의 사용자 ID를 변경하지 않습니다. 앱이 변경되었습니다. – CommonsWare

0

있도록 호환되지 않는 인터페이스를 사용자 정의 서비스를 작성하지 않고 직접 플러그인 주에게 시스템 서비스합니다 (을 locationManager를)하게하는 것이 가능하다 메인 앱은 플러그인의 LocationManager를 사용할 수 있습니다.

이것은 불가능합니다. LocationManagerParcelable이 아니므로 프로세스간에 전달할 수 없습니다.

이렇게하면 MyLocationOverlay 또는 다른 클래스와 같은 기존 클래스를 사용할 수 있습니다.

음, 아니오. MyLocationOverlay을 쓰지 않았습니다. 당신은 자신의 디자인으로 어떤 가짜 LocationManager을 사용하도록 강요 할 수 없습니다.

주요 응용 프로그램

ContextWrapper처럼 이러한 클래스에 ContextWrapper를 전달할 수 Parcelable하지 않습니다, 그래서 당신은 프로세스 사이를 전달할 수 없습니다.

+0

다른 서비스를 사용하도록 MyLocationOverlay를 강제 설정할 수 없다고 절대적으로 아닙니다. 나는 ContextWrapper가 플러그인의 일부라는 것을 의미하지는 않는다. 기본 응용 프로그램에서 만들어지며 Context.getSystemService()를 사용하여 시스템 서비스를 가져 오는 모든 클래스에 전달됩니다. ContextWrapper의 유일한 작업은 플러그인의 LocationManager를 얻는 것입니다. 이미 프록시를 만들려면 LocationManager를 하위 클래스로 만들려고했지만 LocationManager에는 개인 생성자가 있으므로 불가능합니다. – Tom

+0

@Tom : 'ContextWrapper'의 사용법을 잘못 이해했는데, 그것은 확실히이 문제에 대한 흥미로운 접근법입니다. 여전히 프로세스 사이에 LocationManager를 사용할 수 없으며 사용하는 매개 변수 중 일부 (GpsStatus','Looper' 등)도 사용할 수 없습니다. 'MyLocationOverlay'를 작성하지 않았기 때문에 안드로이드의 향후 버전에서 어떻게 변할지 모르기 때문에, 부분적인 API 구현을 지원하는'LocationManager'의 하위 클래스를 만들면 앱이 충돌하기 시작할 수 있습니다 프로세스 경계를 ​​넘어서. – CommonsWare

+0

@Tom : 임의의 다른 앱이 플러그인에서 위치 데이터를 가져 오지 못하도록 보안과 관련하여 작업하는 한 APK 플러그인 방식 자체는 건전합니다. 그러나 자체 API (예 : AIDL)를 구현하고 동일한 API를 사용해야 할 것으로 판단됩니다. – CommonsWare

1

예, 가능하지만 안드로이드 OS 엔지니어가 다른 기능을 사용하여이 기능과 다른 두 가지 방법 (동일한 uuid, 동일한 서명)을 사용하지 못하게 할 것을 강력히 권고합니다. 구멍 "권한 시스템 및 안드로이드 보안에 심각한 문제가 ...

그냥 3 친화적 인 응용 프로그램을 상상해보십시오. 첫 번째 사람은 인터넷에 연결할 수있는 권한이 있으며 두 번째 사람은 SMS 메시지를 보낼 수 있지만 세 번째 사람은 자신의 위치에 액세스 할 수 있습니다 .... 각 앱은 상대적으로 무해합니다 ...하지만 이미지는 무엇입니까? 그들이 의사 소통을 할 수 있기 때문에 그들 모두와 함께하십시오.

관련 문제