0

このような外部パスを取得したい場合、デバイスに Android 2.1 (api 7) がある場合

        File f;
        int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
        if (sdkVersion >= 8) {
            System.out.println(">=8");
            f = getApplicationContext().getExternalFilesDir(null);
        } else {
            System.out.println("<=7");
            f = Environment.getExternalStorageDirectory();
        }

LogCat には次のように表示されます。

05-25 15:44:08.355: W/dalvikvm(16688): VFY: unable to resolve virtual method 12: Landroid/content/Context;.getExternalFilesDir (Ljava/lang/String;)Ljava/io/File;

、しかし、アプリはクラッシュしません。VFYとは何ですか?仮想マシンの dalvik に、呼び出されたメソッド内のコードが有効かどうかをチェックするものはありますか? 現在のプロジェクトはAndroid 2.2に対してコンパイルされたため、Eclipseは文句を言いませんでしたが、実行時にLogCatエントリを取得します

PS:私は実際にはこのようなメソッドを使用していません.API <= 7またはAPI> = 8のクラスを初期化するヘルパークラスがあります..しかし、それでも答えてください!

4

1 に答える 1

1

はい、VFYエラーは dalvik の dex verifier からログに記録されます。

SDK バージョンのランタイム チェックを実行し、API メソッドを呼び出しているため、この問題に直面しています。問題は、メソッド呼び出しがif(){}下位の API レベルでは決して実行されない可能性があるブロック内にある場合でも、シンボリック情報が生成されたバイトコードに存在することです。プラットフォーム固有の関数呼び出しを実行する必要がある場合は、リフレクションを使用する必要があります。

File f;
int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
if (sdkVersion >= 8) {
    System.out.println(">=8");
    try {
        Method getExternalFilesDir = Context.class.getMethod("getExternalFilesDir",  new Class[] { String.class } );
        f = (File)getExternalFilesDir.invoke(getApplicationContext(), new Object[]{null});                  
    } catch (Exception e) {
        e.printStackTrace();
    } 

} else {
    System.out.println("<=7");
    f = Environment.getExternalStorageDirectory();
}
于 2012-06-07T10:14:43.427 に答える