2011-02-02 13 views
7

Sto sviluppando un'applicazione che utilizzaAndroid compatibilità del codice a ritroso

android.hardware.Camera.parameters.getSupportedPictureSizes()

Questo è disponibile solo da SDK versione 8 e vorrei per essere compatibile con SDK 4, quindi ho fatto questo:

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

Ma sull'emulatore, cuciture che cerca di controllare il riferimento a questa funzione, e non riesce:

02-02 11: 20: 10.930: ERRORE/dalvikvm (1841): Impossibile trovare metodo android.hardware.Camera $ Parameters.getSupportedPictureSizes, fa riferimento dal metodo com.test.demo.CameraCustom.takeAPicture

alcuna idea su come risolvere questo problema di compatibilità a ritroso?

Ho provato a utilizzare l'inkocation con questo codice all'interno di surfaceChanged. Ovviamente, il codice funziona direttamente senza invocazione:

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()); 
} 

ottengo "getRotation esiste", ma poi "eccezione che invoca getRotation java.lang.NullPointerException

Qualsiasi idea

risposta

5

Non è possibile caricare il codice che contiene.? Chiama allo getSupportedPictureSizes() al livello API 7 e prima. Di conseguenza, devi prendere una decisione basata su prima del carica il codice contenente l'istruzione dipendente dalla versione

Le opzioni includono:

  • disattivare il, tasto menu a scelta, o qualsiasi altra cosa che porta alla attività che utilizza getSupportedPictureSizes(), in base al livello di API
  • uso condizionato classe di carico o tecniche simili a caricare un'implementazione adatto in base sul livello di API, dove il "adatto attuazione" utilizza getSupportedPictureSizes() solo a livello di API 8 o superiore

Un esempio di quest'ultimo tecnica può essere visto in this sample project, dove sostengo telecamere rivolte in avanti a livello API 9, ancora può ancora funzionare su vecchio er versioni di Android.

+0

Sì, penso che dovrei fare qualcosa di simile: http://developer.android.com/resources/articles/backward-compatibility.html, grazie! – zegnus

+0

Ok, il problema è che non posso usare un'altra classe perché voglio usare getRotation() da getWindowManager(). GetDefaultDisplay(). GetRotation(), disponibile solo in SDK> = 8. Quindi ho provato ad usare invocazione, ma genera un'eccezione di puntatore nullo, il codice è mostrato nel mio messaggio originale. – zegnus

3

Ok, la risposta fornita da Commonsware è corretta, specialmente se si studia l'eccellente progetto di esempio che ha fornito. Inoltre, zegnus era sulla strada giusta quando ha indicato http://developer.android.com/resources/articles/backward-compatibility.html

La chiave di questo, però, che non è chiaro dalla altra risposta, è che è necessario compilare con l'API che supporta le funzioni di cui avete bisogno. Altrimenti si ottengono errori. Le fotocamere rivolte in avanti di Commonsware ad esempio sono prima supportate in livello API 9 e questo è ciò che devi specificare nel tuo progetto per farlo compilare. Quindi è possibile utilizzare le altre tecniche descritte sopra per verificare se il sistema operativo in cui è in esecuzione l'applicazione supporta effettivamente le classi e/oi metodi che si sta tentando di utilizzare.Se l'app è in esecuzione su una versione precedente del sistema operativo, le chiamate generano un'eccezione che è possibile intercettare e adottare l'azione appropriata per il sistema operativo precedente.

Per motivi di completezza, ecco il codice che ero compatibile con API 7 anche se ho compilato con API 8, che include 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); 
    } 
} 
Problemi correlati