11

いくつかの内部ファイル(バイナリファイル)を提供するために、ContentProviderを使用してアプリを開発しています。サムスンギャラクシーS、SII、またはその他に展開すると、完全に機能します。ギャラクシーネクサスまたはネクサスSで試してみると、機能しません。

シナリオ:

私のContentProviderには2つのURIでアクセスできます。このURIに応じて、プロバイダーはDataCursor(CrossProcessCursorを拡張)またはModelCursor(CrossProcessCursosも拡張)を作成します。実際、Nexusファミリでは、最初のカーソル(DataCursor)にアクセスして識別子を取得します。これは完全に機能しますが、2番目のカーソルにアクセスすると、試行時に常に「OutOfBoundsException」がスローされます。

getBlob()

方法。

プロバイダー

@Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        Cursor cursor = null;

        // If the third app requieres DATA (phrase id, phrase string and phrase name)
        if(uri.toString().equalsIgnoreCase(ProviderConstants.DATA_URI.toString())) {
            // Build the DataHelper and the customized cursor
            DataHelper dataHelper = new DataHelper(getContext());
            cursor = new DataCursor(dataHelper);
        } else if(uri.toString().equalsIgnoreCase(ProviderConstants.MODEL_URI.toString())) {            
            // Let's take the model id from the selectionArgs...
            if (selectionArgs != null && selectionArgs.length > 0) {
                String modelId = selectionArgs[0];

                // Get an instance to the persistent storage service...
                File file = FileManager.getDirectory(getContext(), modelId);
                FileSystemPersistentStorageService clientPersistentStorageService = new FileSystemPersistentStorageService(file);

                cursor = new ModelCursor(clientPersistentStorageService);
            } else {
                Log.e("ContentProvider", "Query without model id on selectionArgs");
            }
        }

        return cursor;
    }

コードなどが必要な場合は、リクエストしてください。

どうもありがとう。

4

2 に答える 2

1

ついに答えが出ました。デバイスによるものではありませんが、AndroidOSのバージョンによるものです。

4.0.3からの以前のバージョンでは、AbstarctCursorのメソッドfillWindow()が一方向に実装されており、最初の項目のカーソル位置を0に設定する必要はありません。4.0.3以降(ここに表示)、このメソッドが変更され、カーソル位置が0に設定されなくなりました。

スローされた例外は次のとおりです。

07-31 11:35:09.938: W/System.err(2760): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
07-31 11:35:09.985: W/System.err(2760):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:418)
07-31 11:35:09.989: W/System.err(2760):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
07-31 11:35:09.989: W/System.err(2760):     at android.database.AbstractWindowedCursor.getBlob(AbstractWindowedCursor.java:44)
07-31 11:35:09.993: W/System.err(2760):     at android.database.CursorWrapper.getBlob(CursorWrapper.java:122)
07-31 11:35:09.993: W/System.err(2760):     at es.agnitio.kivox.mobile.internal.ModelImporterAndroidImpl.importModelPackage(ModelImporterAndroidImpl.java:44)
07-31 11:35:09.993: W/System.err(2760):     at es.agnitio.kivox.mobile.internal.KivoxMobileBasicCode.importModel(KivoxMobileBasicCode.java:159)
07-31 11:35:09.997: W/System.err(2760):     at es.agnitio.kivox.mobile.internal.KivoxMobileBasicImpl.importModel(KivoxMobileBasicImpl.java:47)
07-31 11:35:09.997: W/System.err(2760):     at es.agnitio.kivoxmobile.testing.KivoxMobileBasicTrial.onCreate(KivoxMobileBasicTrial.java:63)
07-31 11:35:09.997: W/System.err(2760):     at android.app.Activity.performCreate(Activity.java:5008)
07-31 11:35:10.001: W/System.err(2760):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
07-31 11:35:10.001: W/System.err(2760):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
07-31 11:35:10.001: W/System.err(2760):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
07-31 11:35:10.004: W/System.err(2760):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
07-31 11:35:10.004: W/System.err(2760):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
07-31 11:35:10.004: W/System.err(2760):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-31 11:35:10.008: W/System.err(2760):     at android.os.Looper.loop(Looper.java:137)
07-31 11:35:10.008: W/System.err(2760):     at android.app.ActivityThread.main(ActivityThread.java:4745)
07-31 11:35:10.008: W/System.err(2760):     at java.lang.reflect.Method.invokeNative(Native Method)
07-31 11:35:10.012: W/System.err(2760):     at java.lang.reflect.Method.invoke(Method.java:511)
07-31 11:35:10.012: W/System.err(2760):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-31 11:35:10.012: W/System.err(2760):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-31 11:35:10.016: W/System.err(2760):     at dalvik.system.NativeStart.main(Native Method)

これは(詳細な調査の結果)、カーソルインデックスがに設定されていないことを示していますfillWindow()

解決

この「断片化」の問題を解決するには、カスタムカーソルのor (アプリロジックを使用)などのメソッドにmoveToPosition(0)を追加するだけです。これにより、カーソルインデックスが0に設定され、「-1」インデックスリクエストの例外が回避されます。moveToFirst()move()

それが誰かに役立つことを願っています=)

于 2012-08-28T12:11:53.067 に答える
0

私はこれのために水晶玉を少し必要としています、しかし...あなたは2つのことを試すことができます:

  • SteveRが提案したように、カーソルを最初のエントリに移動します。

  • 次に、Dell Streak 7 "タブレットで作業しているときに同様の問題が発生しました。これは、内部ストレージへのアクセスに関して特定の例外を除いて、デバイスのリストの一部であると考えられます。見つけるのは困難でしたが、ifで並べ替えられました。特にNexusが開発者のデバイスであると想定されているため、私はそれを疑っていますが、似たようなものになる可能性があります。

おそらく、可能な限り単純なContentProviderテストアプリを実行して、それらのデバイスでどのように動作するかを確認する必要があります。

于 2012-08-14T07:03:26.810 に答える