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 线程上运行,因此很容易将延迟引入您的应用程序。理想情况下,您希望使用 aCursorLoader但将所有工作包装在一个中可能会更容易AsyncTask(“所有工作”是指与保存/检索/解码图像文件相关的所有工作......和我建议这样做,因为完成所有这些工作可能需要相当长的时间,而且如果 UI 线程被阻塞太久,您的应用程序可能看起来很慢)。

  2. 如果您确实选择将您的工作AsyncTask包装doInBackground()onPostExecute().

于 2012-10-07T15:51:17.287 回答