2015-01-09 8 views
0

Android Keyguard 앱 ('화면 잠금'을 보유하고있는 시스템 앱)에 액세스 할 수있는 앱을 작성하려고합니다. 나는 Reflection을 사용하여 실행중인 KeyguardUpdateMonitor 인스턴스에 대한 참조를 얻으려고 시도했지만, 지금까지는 java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation만을 받았습니다.java.lang.IllegalAccessError Android 내부 앱의 정적 기능에 액세스하려고 시도했습니다.

try { 
    DexFile df = new DexFile(new File("/system/priv-app/Keyguard.apk")); 
    String packageName = "com.android.keyguard"; 
    Context packageContext = context.createPackageContext(packageName, 
           Context.CONTEXT_INCLUDE_CODE 
           | Context.CONTEXT_IGNORE_SECURITY); 
    ClassLoader cl = packageContext.getClassLoader(); 
    Class keyguardUpdateMonitor = df.loadClass(packageName 
            + ".KeyguardUpdateMonitor", cl); 
    Method getKeyguardUpdateMonitorInstance 
     = keyguardUpdateMonitor.getMethod("getInstance", Context.class); 
    Object argumentsForGetInstance[] = new Object[1]; 
    argumentsForGetInstance[0] = packageContext; 
    Object keyguardUpdateMonitorInstance 
     = getKeyguardUpdateMonitorInstance.invoke(null, packageContext); 
    ... 
} 

이 코드는 서비스에 통해 인스턴스 된 클래스 내에서 실행됩니다 : 다음은 문제의 원인이되는 코드입니다.

내가 전화하려고 시도하는 방법의 서명은 public static KeyguardUpdateMonitor getInstance(Context context)입니다.

  • 내가 의도 한대로 반영을 사용할 수 있습니까? 아니면 KeyguardUpdateMonitor의 인스턴스가 필요합니까?
  • 특별한 사용 권한이 필요합니까?
  • 내 아이디어에 근본적인 실수가 있습니까? 그렇다면 어떻게 안드로이드 (KitKat 이상)의 Keyguard에 액세스 할 수 있습니까?

답변

0

IMHO - 아이디어에 근본적인 실수가 있습니다. KeyguardUpdateMonitor는 Home 프로세스 내부에서 인스턴스화되는 클래스입니다. 귀하의 코드 (서비스로 실행 중)는 정상적인 Linux (Unix) 프로세스 메모리 보호로 인해 프로세스에서 벗어나 보호됩니다. 패키지 컨텍스트를 만들려고했으나 프로세스 내부에있는 경우 만들어져 Home 응용 프로그램과 아무 관련이 없습니다. 그리고 그 위에 KeyguardUpdateMonitor (아래 링크)의 코드 "의 getInstance (컨텍스트)"정적 기능 ...

좋은 소식은 그러나 https://github.com/android/platform_frameworks_policies_base/blob/master/phone/com/android/internal/policy/impl/KeyguardUpdateMonitor.java 은 방송 수신기 점이다이하지 않는 것 같습니다.

당신은 http://developer.android.com/reference/android/app/KeyguardManager.html getSystemService (KEYGUARD_SERVICE)

가 조금 희망이 도움에 보내는 의도을 통해에 "대화"할 수 있습니다.

+0

힌트를 가져 주셔서 감사합니다.하지만 브로드 캐스트 리시버가 처리하는 의도는 내 문제를 해결하지 못합니다. 어쨌든 고마워. 첫 단락은 매우 도움이되었습니다. Btw : KeyguardUpdateMonitor에 getInstance (Context) 함수가 있습니다. 제공 한 링크가 구형입니다. – user2925177