0

撮影したばかりの写真を指定した場所にコピーするAsyncTaskがあり、元の写真が削除されます。ただし、ほとんどの場合、エラーが発生し続けます。

final String[] projection = { MediaStore.Images.ImageColumns.SIZE,
                MediaStore.Images.ImageColumns.DISPLAY_NAME,
                MediaStore.Images.ImageColumns.DATA,
                BaseColumns._ID,};

        u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        boolean found = false;

        if (CurrentFile != null)
        {               
            if ((u != null) && (CurrentFile.length() > 0))
            {
                Looper.prepare();   
                getSupportLoaderManager().initLoader(0, null, new LoaderCallbacks<Cursor>(){

                    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
                        CursorLoader loader = new CursorLoader(ExpenseReport.this, u, projection, null, null, null);
                        return loader;
                    }

                    public void onLoadFinished(Loader<Cursor> arg0, Cursor c) {
                        if ((c != null) && (c.moveToFirst())){

                            do 
                            {

                                for (String sGallery : GlobalInfo.GalleryList){

                                    if (sGallery.equalsIgnoreCase(c.getString(1))){
                                        found = true;
                                        break;
                                    }
                                } 
                                if (!found){
                                    File f = new File(c.getString(2));


                                    if ((f.exists()) && (CurrentFile.length() < c.getLong(0)) && (CurrentFile.delete())){

                                        try
                                        {
                                            CurrentFile.createNewFile();
                                            FileChannel source = null;
                                            FileChannel destination = null;
                                            try{
                                                source = new FileInputStream(f).getChannel();
                                                destination = new FileOutputStream(CurrentFile).getChannel();
                                                destination.transferFrom(source, 0, source.size());
                                            }
                                            finally{

                                                if (source != null)
                                                    source.close();

                                                if (destination != null)
                                                    destination.close();
                                            }
                                        }
                                        catch (IOException e)
                                        {
                                            e.printStackTrace();
                                            GlobalInfo.LOG("", "Couldn't Copy The File");

                                        }
                                    }
                                    ContentResolver cr = getContentResolver();
                                    Bitmap bitmap=null;
                                    try {
                                        bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, CurrentUri);
                                    } catch (FileNotFoundException e1) {
                                        e1.printStackTrace();

                                    } catch (IOException e1) {
                                        e1.printStackTrace();

                                    }
                                    if(bitmap.getWidth()<2000) 
                                        bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), false);
                                    else
                                        bitmap = Bitmap.createScaledBitmap(bitmap, 2000, 2000, false);

                                    try {
                                        FileOutputStream out = new FileOutputStream(CurrentFile);
                                        bitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);
                                    } catch (Exception e) {
                                        e.printStackTrace();

                                    }

                                    cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                                            BaseColumns._ID + "=" + c.getString(3), null);

                                    break;                        
                                }
                            } 
                            while (c.moveToNext());
                        }
                    }

                    public void onLoaderReset(Loader<Cursor> arg0) {                        
                    }

                });
                Looper.loop();
            }
        }

これは私が得ているエラーです:

07-26 09:38:58.060: E/CursorWindow(1566): Bad request for field slot 0,1. numRows = 14, numColumns = 1
07-26 09:38:58.107: W/dalvikvm(1566): threadid=10: thread exiting with uncaught exception (group=0x40015578)
07-26 09:38:58.142: E/AndroidRuntime(1566): FATAL EXCEPTION: AsyncTask #1
07-26 09:38:58.142: E/AndroidRuntime(1566): java.lang.RuntimeException: An error occured while executing doInBackground()
07-26 09:38:58.142: E/AndroidRuntime(1566):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at java.lang.Thread.run(Thread.java:1019)
07-26 09:38:58.142: E/AndroidRuntime(1566): Caused by: java.lang.IllegalStateException: get field slot from row 0 col 1 failed
07-26 09:38:58.142: E/AndroidRuntime(1566):     at android.database.CursorWindow.getString_native(Native Method)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at android.database.CursorWindow.getString(CursorWindow.java:361)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:49)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at android.database.CursorWrapper.getString(CursorWrapper.java:135)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at com.report.expense.ExpenseReport$FinishPhotoTask$1.onLoadFinished(ExpenseReport.java:1131)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at com.report.expense.ExpenseReport$FinishPhotoTask$1.onLoadFinished(ExpenseReport.java:1)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:425)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at android.support.v4.app.LoaderManagerImpl.initLoader(LoaderManager.java:559)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at com.report.expense.ExpenseReport$FinishPhotoTask.doInBackground(ExpenseReport.java:1115)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at com.report.expense.ExpenseReport$FinishPhotoTask.doInBackground(ExpenseReport.java:1)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at     android.os.AsyncTask$2.call(AsyncTask.java:185)
07-26 09:38:58.142: E/AndroidRuntime(1566):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
07-26 09:38:58.142: E/AndroidRuntime(1566):     ... 4 more

(ExpenseReport.java:1115):

getSupportLoaderManager().initLoader(0, null, new LoaderCallbacks<Cursor>(){

(ExpenseReport.java:1131):

if (sGallery.equalsIgnoreCase(c.getString(1))){

編集:写真を撮る前後の写真名のリストを比較して、撮ったばかりの写真のサイズ、名前、場所、IDを取得しようとしています。問題は、このコードが正常に機能する場合と、このエラーが発生する場合があることです。

4

2 に答える 2

0

(OPの提案に従って、私のコメントから回答を作成します):

getColumnNamesでメソッドを使用してCursor、 から実際に取得している列のリストを取得できますMediaStore。うまくいけば、それは何が起こっているのかについてのヒントを提供します.

于 2012-07-30T15:02:37.603 に答える
0

何が起こったのかというと、アクティビティに ID 0 の LoaderManager が複数あったため、クエリは以前の列を返していました (これは写真の名前だけで、他には何もありませんでした。列名を確認するためのヒントをくれた Michael に感謝します)。

于 2012-07-30T14:51:19.390 に答える