【问题标题】:Save photo in internal storage将照片保存在内部存储器中
【发布时间】:2015-12-07 09:14:57
【问题描述】:

我有一个问题,我想将照片保存在内部存储中。但我不知道怎么做。谁能提出一些解决方案?谢谢。 有我的代码:

public class ThreeFragment extends Fragment {


private static final String TAG = ThreeFragment.class.getSimpleName();
private static int RESULT_LOAD_IMAGE = 1;
private static final int REQUEST_IMAGE_CAPTURE = 1;
View root;
GridView gridView;
String mCurrentPhotoPath;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    root = inflater.inflate(R.layout.fragment_three, container, false);
    dolist();
    return root;
}
public void dolist() {
    gridView = (GridView) root.findViewById(R.id.gridview);
    gridView.setAdapter(new ImageAdapter(getActivity()));
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            switch (position) {
                case 0:
                    openGallery();
                    break;
                case 1:
                    takePhoto();
                    break;

                case 2:
                    Log.d(TAG, "333333333333333333333");
                    break;
                default:

                    break;
            }
        }
    });
}

private void takePhoto() {

    Intent cameraIntent = new Intent("android.media.action.IMAGE_CAPTURE");
    if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
        startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE);
    }
}
private String saveToInternalSorage(Bitmap bitmap) {
    ContextWrapper cw = new ContextWrapper(getActivity());
    File dic = cw.getDir("TEST", Context.MODE_PRIVATE);

    File mypath = new File(dic, ".jpg");
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(mypath);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return dic.getAbsolutePath();
}

public void openGallery() {
    Intent i = new Intent(Intent.ACTION_PICK,
            MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    startActivityForResult(i, RESULT_LOAD_IMAGE);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    //super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_LOAD_IMAGE) {
        if (resultCode == Activity.RESULT_OK && null != data) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = {MediaStore.Images.Media.DATA};
            Cursor cursor = getActivity().getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();
        }
    }
    else if (requestCode == REQUEST_IMAGE_CAPTURE) {
        if (resultCode == Activity.RESULT_OK) {
            Bundle extras = data.getExtras();
            Bitmap bitmap = (Bitmap) extras.get("data");
            saveToInternalSorage(bitmap);

           // setPath(saveToInternalSorage(bitmap));
        }

    }
}

}

【问题讨论】:

  • 您在缩略图中的 onActivityResult 中得到了什么。是否要将原始图像保存到存储中?
  • 是的。我只是保存它。但是在拍照后我的应用程序出现错误失败将结果 ResultInfo{who=null, request=196609, result=-1, data=Intent { act=inline-data (has extras) }} 发送到活动 {com.example.qtv .myapplication/com.example.qtv.myapplication.view.MainActivity}: java.lang.NullPointerException: uri
  • 有一种简单的方法: mTempImageFile :这是您要存储图像文件的路径。 Uri tempURI = Uri.fromFile(mTempImageFile);意图 i = 新意图(MediaStore.ACTION_IMAGE_CAPTURE); i.putExtra(MediaStore.EXTRA_OUTPUT, tempURI); activity.startActivityForResult(i, CHOOSE_CAMERA_RESULT);

标签: android camera save photo internal


【解决方案1】:
*Try This :
File mImageFile is path where you want to store you camera image file.

Uri tempURI = Uri.fromFile(mImageFile);
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(MediaStore.EXTRA_OUTPUT, tempURI);
activity.startActivityForResult(i, CHOOSE_CAMERA_RESULT);


then in your onActivityResult

@Override
public void onActivityResultRAW(int requestCode, int resultCode, Intent data)
{
    super.onActivityResultRAW(requestCode, resultCode, data);
    switch(requestCode)
    {
    case CHOOSE_CAMERA_RESULT:
    {
        if (resultCode == RESULT_OK)
        {
            // here you image has been save to the path mImageFile.
            Log.d("ImagePath", "Image saved to path : " + mImageFile.getAbsoultePath());
        }
    }
    break;
    }
}*

【讨论】:

  • sr .. 也许你理解错了我的理想。我想保存在相同的路径上 "This PC\Nexus 5\Internal storage\DCIM\.thumbnails" 。当我们在PC上打开它时,你可以看到所有的图片。
  • @AceAkatsuki 您可以将图像存储在您想要存储的任何位置,只需给出该路径,例如 mImageFile = Envinorment.getExternalStorageDirectory() + File.Seperator + "DCIM" ;它将图像存储在此位置。如果我理解错了请解释一下。
  • 文件 mImageFile = new File(Environment.getExternalStorageDirectory() + File.separator + "DCIM");但日志不显示。当我添加“DCIM\\.abc”)(abc is floder is exits)然后出现错误尝试在空对象引用上调用虚拟方法'java.lang.String java.io.File.getAbsolutePath()'。你能解释一下吗?谢谢。
  • @AceAkatsuki 你能分享你的代码吗?最好是github ghist
  • 我尝试了很多案例,我希望你能告诉我这个错误。有链接 github 。我在 ThreeFragment.class 中的问题。 github.com/QuangTo/DemoSimple/tree/qtv/app/src
【解决方案2】:

试试这个:

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, setImageUri());
cameraIntent.putExtra("return-data", true);
mActPanelFragment.startActivityForResult(cameraIntent, ActivityConstantUtils.CAMERA_REQUEST);

// 方法

 public Uri setImageUri() {

    File file = new File(Environment.getExternalStorageDirectory().getPath(), ActivityConstantUtils.STORED_IMAGE_PATH+"/Images/WOMCamera");
    if (!file.exists()) {
        file.mkdirs();
    }
    ActivityConstantUtils.mCurrentPhotoPath = (file.getAbsolutePath() + "/"+"IMG_"+ System.currentTimeMillis() + ".jpg");
    Uri imgUri = Uri.fromFile(new File(ActivityConstantUtils.mCurrentPhotoPath));
    if (file.canWrite()) {
    }
    return imgUri;
}

然后为结果编写代码:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ActivityConstantUtils.GALLERY_INTENT_REQUEST_CODE && resultCode == Activity.RESULT_OK) {

                String imagePath = getFilePath(data);
    }
    }

private String getFilePath(Intent data) {
        String imagePath;
        Uri selectedImage = data.getData();
        String[] filePathColumn = {MediaStore.Images.Media.DATA};

        Cursor cursor = getActivity().getContentResolver().query(selectedImage, filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        imagePath = cursor.getString(columnIndex);
        cursor.close();

        return imagePath;

    }

【讨论】:

  • "ActivityConstantUtils.mCurrentPhotoPath" 静态变量,您将其替换为 Global 或 Local Variable 。数据类型必须是字符串。
  • 我真的不明白。请解释一下。我是菜鸟。 ActivityConstantUtils 是类。因为我看到它调用子方法..
  • 不要混淆用“String mImagePath”替换那个完整的变量。
  • 谢谢兄弟。我试试你的代码,但我没有看到任何变化。我在 String imagePath = getFilePath(data); 下面添加 Log.d得到imagePATH但没有什么可显示的..它没有得到路径?? .你能解释一下吗?
  • 也许我的问题是错误的。我想像链接“This PC\Nexus 5\Internal storage\DCIM\.abc”一样保存照片。在那里文件夹 abc 退出。我的应用中的所有照片都保存在那里。
猜你喜欢
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多