Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android向后代码兼容性_Android_Backwards Compatibility - Fatal编程技术网

Android向后代码兼容性

Android向后代码兼容性,android,backwards-compatibility,Android,Backwards Compatibility,我正在开发一个使用 android.hardware.Camera.parameters.getSupportedPictureSizes() 这仅适用于SDK版本8,我希望与SDK 4兼容,因此我已完成以下操作: 如果(Build.VERSION.SDK_INT>=8){…} 但在emulator上,它发现它试图检查对该函数的引用,但失败了: 02-02 11:20:10.930:错误/dalvikvm(1841):找不到方法android.hardware.Camera$Parameters

我正在开发一个使用

android.hardware.Camera.parameters.getSupportedPictureSizes()

这仅适用于SDK版本8,我希望与SDK 4兼容,因此我已完成以下操作:

如果(Build.VERSION.SDK_INT>=8){…}

但在emulator上,它发现它试图检查对该函数的引用,但失败了:

02-02 11:20:10.930:错误/dalvikvm(1841):找不到方法android.hardware.Camera$Parameters.getSupportedPictureSizes,从方法com.test.demo.CameraCustom.TakeApiture引用

你知道如何解决这个向后兼容性问题吗

我已经尝试在surfaceChanged中使用InLocation和这段代码。显然,代码直接工作,无需调用:

try{
    windowmanager_defaultdisplay_Rotation = getWindowManager().getDefaultDisplay().getClass().getMethod("getRotation");
    Log.v(MainMenu.TAG, "getRotation exist");
}catch(Exception e){
    Log.v(MainMenu.TAG, "getRotation dont exist");
}

try{
    windowmanager_defaultdisplay_Rotation.invoke(null, null);
    Log.v(MainMenu.TAG, "getRotation invoking ok, rotation ");
}catch(Exception e){
    Log.v(MainMenu.TAG, "exception invoking getRotation "+e.toString());
}
我得到“getRotation exist”,但得到“调用getRotation java.lang.NullPointerException的异常”


有什么想法吗?

您不能在API级别7及之前加载包含对
getSupportedPictureSizes()
调用的代码。因此,在加载包含版本相关语句的代码之前,您需要根据
Build
做出决定

你的选择包括:

  • 根据API级别禁用菜单选项、按钮或导致使用
    getSupportedPictureSizes()
    的活动的任何内容
  • 使用条件类加载或类似技术根据API级别加载合适的实现,其中“合适的实现”仅在API级别8或更高级别上使用
    getSupportedPictureSizes()

后一种技术的一个例子可以在中看到,我在API level 9上支持前向摄像头,但仍然可以在旧版本的Android上运行。

好的,Commonware提供的答案是正确的,特别是如果你研究他提供的优秀示例项目。此外,zegnus指出

但是,另一个答案并不清楚,关键是您需要使用支持所需功能的API进行编译。否则会出现错误。在Commonware的示例中,前向摄像头首先在API级别9中得到支持,这是您必须在项目中指定的,以便对其进行编译。然后您可以使用上述其他技术测试运行应用程序的操作系统是否实际支持您尝试使用的类和/或方法。如果您的应用程序在较旧版本的操作系统上运行,则调用将生成一个异常,您可以捕获该异常并对较旧的操作系统采取适当的操作

为了完整起见,下面是我曾经与API 7兼容的代码,尽管我使用API 8编译,其中包括ThumbnailUtils

import com.Flashum.util.WrapThumbnailUtils;

   public static Bitmap createVideoThumbnail(String filePath, int kind) {
      try {
         WrapThumbnailUtils.checkAvailable(); // will cause exception if ThumbnailUtils not supported
         return WrapThumbnailUtils.createVideoThumbnail(filePath, kind);
      } catch (Exception e) {
         return null;
      }
   }

package com.Flashum.util;

import android.graphics.Bitmap;
import android.media.ThumbnailUtils;

// To be compatible with Android 2.1 need to create
// wrapper class for WrapThumbnailUtils.
public class WrapThumbnailUtils {
   /* class initialization fails when this throws an exception */
   static {
      try {
         Class.forName("android.media.ThumbnailUtils");
      } catch (Exception ex) {
         throw new RuntimeException(ex);
      }
   }

   /* calling here forces class initialization */
   public static void checkAvailable() {}

   public static Bitmap createVideoThumbnail(String filePath, int kind) {
      return ThumbnailUtils.createVideoThumbnail(filePath, kind);
   }
}

是的,我想我应该这样做:,谢谢!好的,问题是我不能使用另一个类,因为我想使用getWindowManager().getDefaultDisplay().getRotation()中的getRotation(),仅在SDK>=8中可用。因此我尝试使用调用,但它引发空指针异常,代码显示在我的原始消息中。