0

私のアプリでは、ユーザーはギャラリーからアバターとして写真を選択できますが、ファイルを削除できるようにアプリのストレージに保存したいと考えています。

私のコードは次のとおりです。

//onActivityResult()
else if (requestCode == SELECT_PICTURE)
            {
                mFile = new File(getRealPathFromURI(data.getData()));

                Date d = new Date();
                long ms = d.getTime();
                mName = String.valueOf(ms) + ".jpg";

                copyfile(mFile,mName);

                File file = new File(Environment.getExternalStorageDirectory(), mName);
                Bitmap myBitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
                imgPhoto.setImageBitmap(myBitmap);

            }

   public String getRealPathFromURI(Uri contentUri)
{
    // can post image
    String [] proj={MediaStore.Images.Media.DATA};
    Cursor cursor = managedQuery( contentUri,proj,null,null,null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
} 


    private void copyfile(File file,String newFileName){
    try{
      InputStream in = new FileInputStream(file);
      OutputStream out = openFileOutput(newFileName, MODE_PRIVATE);
      byte[] buf = new byte[4096];
      int len;
      while ((len = in.read(buf)) > 0){
        out.write(buf, 0, len);
      }
      in.close();
      out.close();
      Log.d(null,"success");
    }
    catch(FileNotFoundException ex){
        ex.printStackTrace();
    }
    catch(IOException e){
        e.printStackTrace();     
    }
  }

ビットマップでmFileをデコードすると、画像が表示されるので、mFileには画像があります。何か案は?

4

1 に答える 1

2

まず第一に、あなたは現在の行動について私たちに話していません。アプリがクラッシュしますか? 画像が表示されませんか?その他の予期しない動作はありますか?

それ以外:

  1. 使用しないでくださいmanagedQuery()... メインの UI スレッドで実行されるため、アプリケーションにラグが発生しやすくなります。理想的には を使用したいのですが、CursorLoaderすべての作業を でラップする方が簡単かもしれませんAsyncTask(「すべての作業」とは、画像ファイルの保存/取得/デコードに関連するすべての作業を意味します...そしてこのすべてを実行するにはかなりの時間がかかる可能性があり、UI スレッドが長時間ブロックされているとアプリが遅く見える可能性があるため、これをお勧めします)。

  2. 作業を でラップすることを選択した場合AsyncTask(そうすることをお勧めします)、すべての作業を に入れ、 でdoInBackground()終了したときにそれに応じて UI を更新しますonPostExecute()

于 2012-10-07T15:51:17.287 に答える