这是我正在使用的代码
Intent i = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i, cameraData);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
try {
InputStream is = getContentResolver().openInputStream(data.getData());
Main.this.getContentResolver().delete(data.getData(), null,
null);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
String error = e.toString();
Dialog d = new Dialog(this);
TextView tv = new TextView(this);
tv.setText(error);
d.setContentView(tv);
d.show();
}
} else {
is = null;
}
}
我这样做是因为我不想将图片保存到dcim文件夹。 它在三星,HTC和其他一些设备上工作正常,但它在alcatel one touch 5020x Jelly Bean 4.1.1上崩溃, 返回空指针异常。
是否有其他方法可以执行此操作,但不能将图片保存到dcim文件夹。 我已经看到很多解决方案可以做到这一点,但所有这些解决方案都将图片保存到dcim文件夹
感谢名单
答案 0 :(得分:1)
我这样做是因为我不想将图片保存到dcim文件夹。
然后在EXTRA_OUTPUT
ACTION_IMAGE_CAPTURE
中添加Intent
,告诉您的相机应用处理您的请求放置图像的位置。引用the documentation:
调用者可以传递额外的EXTRA_OUTPUT来控制该图像的写入位置。如果EXTRA_OUTPUT不存在,则在额外字段中返回一个小尺寸图像作为Bitmap对象。
您编写的代码不会记录任何内容。相反,您假设相机应用程序将返回图像所在的Uri
。 这不是文档化协议的一部分,因此在与许多相机应用交互时,您的代码将失败。
是否有其他方法可以执行此操作,但不能将图片保存到dcim文件夹。
此代码会将图像放在外部存储设备的另一个位置:
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import java.io.File;
public class CameraContentDemoActivity extends Activity {
private static final int CONTENT_REQUEST=1337;
private File output=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
output=new File(getExternalFilesDir(null), "CameraContentDemo.jpeg");
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output));
startActivityForResult(i, CONTENT_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == CONTENT_REQUEST) {
if (resultCode == RESULT_OK) {
// use the output File object
}
}
}
}
答案 1 :(得分:0)
这不是最佳解决方案,但它有效!
final static int cameraData = 13579;
final static int camera2Data = 97531;
InputStream is = null;
int camera2 = 0;
SharedPreferences spData;
public static String spName = "MySharedString";
相机启动:
if (camera2 == 1) {
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
output = new File(getExternalFilesDir(null),
"CameraContentDemo.jpg");
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output));
startActivityForResult(i, camera2Data);
} else {
Intent i = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i, cameraData);
}
onActivitrForResult:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == cameraData) {
if (resultCode == RESULT_OK) {
try {
is = getContentResolver().openInputStream(data.getData());
Main.this.getContentResolver().delete(data.getData(), null,
null);
} catch (Exception e) {
// TODO Auto-generated catch block
camera2 = 1;
if (camera2 == 1) {
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
output = new File(getExternalFilesDir(null),
"CameraContentDemo.jpeg");
i.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(output));
startActivityForResult(i, camera2Data);
}
SharedPreferences.Editor editor = spData.edit();
editor.putInt("cam2", 1);
editor.commit();
}
} else {
is = null;
}
}
if (requestCode == camera2Data) {
if (resultCode == RESULT_OK) {
try {
is = new FileInputStream(output);
} catch (Exception e) {
// TODO Auto-generated catch block
SharedPreferences.Editor editor = spData.edit();
editor.putInt("cam2", 0);
editor.commit();
}
} else {
is = null;
}
}
}
所以,就像我说的那样,它不是最好的解决方案,但它有效。 当应用程序首次在阿尔卡特上启动时,它以旧代码启动,崩溃并捕获异常,将camera2变量保存为1,然后使用第二个可正常工作的代码再次启动相机。 当我在其他设备上加载时,它可以正常工作,并且没有图片保存到DCIM文件夹