2013-03-11 48 views
0

我使用supportv4兼容库,我的应用程序的目标API级别是17,我想使它即使在API级别4 当我运行我的应用程序我有这样的错误工作仅在API级别4:Android的API级别4兼容性错误

03-11 16:16:01.412: E/dalvikvm(302): Could not find method android.view.Display.getSize, referenced from method com.meher.tools.menulauncher.common.MyApplicationContext.setScreenDimensions 
03-11 16:16:01.412: W/dalvikvm(302): VFY: unable to resolve virtual method 3065: Landroid/view/Display;.getSize (Landroid/graphics/Point;)V 
03-11 16:16:01.412: W/dalvikvm(302): VFY: rejecting opcode 0x6e at 0x0018 
03-11 16:16:01.412: W/dalvikvm(302): VFY: rejected Lcom/meher/tools/menulauncher/common/MyApplicationContext;.setScreenDimensions (Landroid/view/Display;)V 
03-11 16:16:01.412: W/dalvikvm(302): Verifier rejected class Lcom/meher/tools/menulauncher/common/MyApplicationContext; 
03-11 16:16:01.422: D/AndroidRuntime(302): Shutting down VM 
03-11 16:16:01.422: W/dalvikvm(302): threadid=3: thread exiting with uncaught exception (group=0x4001aa28) 
03-11 16:16:01.422: E/AndroidRuntime(302): Uncaught handler: thread main exiting due to uncaught exception 
03-11 16:16:01.422: E/AndroidRuntime(302): java.lang.VerifyError: com.meher.tools.menulauncher.common.MyApplicationContext 
03-11 16:16:01.422: E/AndroidRuntime(302): at com.meher.tools.menulauncher.MainActivity.onCreate(MainActivity.java:79) 
03-11 16:16:01.422: E/AndroidRuntime(302): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 
03-11 16:16:01.422: E/AndroidRuntime(302): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364) 
03-11 16:16:01.422: E/AndroidRuntime(302): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417) 
03-11 16:16:01.422: E/AndroidRuntime(302): at android.app.ActivityThread.access$2100(ActivityThread.java:116) 
03-11 16:16:01.422: E/AndroidRuntime(302): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
03-11 16:16:01.422: E/AndroidRuntime(302): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-11 16:16:01.422: E/AndroidRuntime(302): at android.os.Looper.loop(Looper.java:123) 
03-11 16:16:01.422: E/AndroidRuntime(302): at android.app.ActivityThread.main(ActivityThread.java:4203) 
03-11 16:16:01.422: E/AndroidRuntime(302): at java.lang.reflect.Method.invokeNative(Native Method) 
03-11 16:16:01.422: E/AndroidRuntime(302): at java.lang.reflect.Method.invoke(Method.java:521) 
03-11 16:16:01.422: E/AndroidRuntime(302): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
03-11 16:16:01.422: E/AndroidRuntime(302): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
03-11 16:16:01.422: E/AndroidRuntime(302): at dalvik.system.NativeStart.main(Native Method) 
03-11 16:16:01.422: I/dalvikvm(302): threadid=7: reacting to signal 3 
03-11 16:16:01.422: E/dalvikvm(302): Unable to open stack trace file '/data/anr/traces.txt': Permission denied 

这是提高错误的代码:

MainActivity.java:

// Init application context 
     myApplicationContext = new MyApplicationContext(this, 
       getWindowManager().getDefaultDisplay()); 

MyApplicationContext.java:

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) 
    @SuppressWarnings("deprecation") 
    public void setScreenDimensions(Display display) { 
     Point size = new Point(); 
     if (android.os.Build.VERSION.SDK_INT < 13) { 
      this.screenWidth = display.getWidth(); 
      this.screenHeight = display.getHeight(); 
     } else { 
      try { 
       display.getSize(size); 
       this.screenWidth = size.x; 
       this.screenHeight = size.y; 
      } catch (java.lang.NoSuchMethodError ignore) { // Older device 
       this.screenWidth = display.getWidth(); 
       this.screenHeight = display.getHeight(); 
      } 
     } 
    } 

AndroidManifest.mf:

<uses-sdk 
     android:minSdkVersion="4" 
     android:targetSdkVersion="17" /> 

回答

1

API等级4并在课堂上使用的任何方法进行全面检查,以确保它的存在,如注意this answer。因此,您可以:

  • 封装在单独的类(其中,因为它们不是在你的V4运行时加载由于条件逻辑,永远不会贪婪地检查)
  • 您的最低SDK移动到所有新的API调用V7(安卓2.1),失去了Android人口0.2%仍然使用V4。
+0

非常感谢您对这个信息,我注意到,因为在那一刻达到代码之前也引发错误当虚拟机加载类!如果只有0.2%的人口输掉,我认为我将使它仅适用于10级以上的api级别! – Meher 2013-03-11 16:34:11

+0

这里你的逻辑(有条件执行的基础上,SDK_INT新API)将在任何V7 +设备的工作。 注意,API V10 +应用达到目前Android人口的90.2%(每相同的仪表板)。 – ianhanniballake 2013-03-11 16:41:00

+0

是的,我meaned API 7级,我测试了我的应用程序在Android 2.1的模拟器它完美的作品,再次感谢您! – Meher 2013-03-12 09:06:46