Совместимость с обратным кодом Android - PullRequest
7 голосов
/ 02 февраля 2011

Я разрабатываю приложение, которое использует

android.hardware.Camera.parameters.getSupportedPictureSizes ()

Это доступно только в SDK версии 8, и я хотел бы быть совместимым с SDK 4, поэтому я сделал это:

if (Build.VERSION.SDK_INT> = 8) {...}

Но на эмуляторе кажется, что он пытается проверить ссылку на эту функцию, и это не удается:

02-02 11: 20: 10.930: ОШИБКА / dalvikvm (1841): не удалось найти метод android.hardware.Camera $ Parameters.getSupportedPictureSizes, на который ссылается метод com.test.demo.CameraCustom.takeAPicture

Есть идеи, как решить эту проблему обратной совместимости?

Я пытался использовать inocation с этим куском кода внутри surfaceChanged. Очевидно, что код работает напрямую без вызова:

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.

Есть идеи?

Ответы [ 2 ]

5 голосов
/ 02 февраля 2011

Вы не можете загрузить код, содержащий вызовы к getSupportedPictureSizes() на уровне API 7 и ранее.Следовательно, вам нужно принять решение на основе Build до того, как вы загрузите код, содержащий оператор, зависящий от версии.

Возможны следующие варианты:

  • Отключите выбор меню, кнопку или что-либо, что приводит к действию, которое использует getSupportedPictureSizes(), на основе уровня API
  • Используйте условную загрузку классов или аналогичные методы для загрузки подходящей реализации на основе уровня API, где "«подходящая реализация» использует getSupportedPictureSizes() только на уровне API 8 или выше

Пример последнего метода можно увидеть в этом примере проекта , где я поддерживаю камеры, обращенные впередна уровне API 9, но все еще может работать на более старых версиях Android.

3 голосов
/ 26 июня 2011

Хорошо, ответ, предоставленный Commonsware, является правильным, особенно если вы изучаете превосходный пример проекта, который он предоставил. Кроме того, Зегнус был на правильном пути, когда он указал на http://developer.android.com/resources/articles/backward-compatibility.html

Ключ к этому, хотя и не ясно из другого ответа, заключается в том, что вам нужно скомпилировать API, который поддерживает необходимые вам функции. В противном случае вы получите ошибки. В примере с Commonsware камеры, направленные вперед, впервые поддерживаются на уровне 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);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...