我试图用意图拍照.我的问题是,有时在拍照后我的活动(调用startActivityForResult)似乎被破坏,以便再次调用onCreate.
这是我点击图片浏览后拍照的代码,应替换哪个图片:
if (!getPackageManager().hasSystemFeature(
PackageManager.FEATURE_CAMERA)) {
Util.makeLongToast(R.string.lang_no_camera);
} else {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, TAKE_ITEM_PHOTO);
}
Run Code Online (Sandbox Code Playgroud)
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.v(TAG, "onactivityresult called");
if (requestCode == TAKE_ITEM_PHOTO) {
if (data != null) {
imageUri = data.getData();
try {
img_photo.setImageBitmap(Media.getBitmap(
getContentResolver(), imageUri));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else
Log.w(TAG, "data is null");
} …Run Code Online (Sandbox Code Playgroud) android android-camera android-camera-intent android-activity
我正在开发使用WebView显示其内容的应用程序.但是,它需要打开相机或图库才能选择图片:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 1);
Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, 2);
Run Code Online (Sandbox Code Playgroud)
它在大多数设备上运行良好,但在HTC One和其他几个设备上都会破坏我的活动,因此在返回时会重新加载webview.我没有noHistory旗帜AndroidManifest.xml.可能导致该问题的原因是什么?我可以避免破坏我在这里的活动吗?
所以,在这个论坛上已经以多种形式提出了这个问题,但没有一个答案对我有所帮助.我有一个我只能在三星Galaxy S3上重现的错误.
我想简单地使用手机的相机拍摄并存储照片,但在我从onActivityResult收到回复之前,我的活动正在被销毁.这只发生在我以纵向模式使用相机时,在横向模式下它很好.
我正在使用此代码启动相机:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, Config.ACTIVITY_TAKE_PHOTO);
Run Code Online (Sandbox Code Playgroud)
在纵向模式下,我从未看到对onActivityResult的调用(来自Camera活动),我只看到在我的启动活动中调用的onDestroy().日志中没有异常或错误,并且没有明显错误使其崩溃.
我看过帖子建议在Manifest中添加"android:configChanges ="orientation | keyboardHidden"",并做很多其他事情来管理使用相机时发生的方向变化,但到目前为止没有任何帮助.
还有其他人解决了这个问题吗?
[编辑:问题解决了.请参阅下面的答案.]
在我的应用程序中,我调用系统相机拍照,然后处理结果onActivityResult.你知道,通常.它曾经工作,但现在我的呼叫活动在我拍摄时被杀死了.具体来说,onDestroy()在按下相机快门后立即调用我的活动.照片确实被拍摄并保存(我已经检查过该文件是否写在SD卡上).在我接受照片后,调用onActivityResult活动堆栈中的先前活动而不是返回到调用活动并调用.我在logcat中看不到任何异常.我的自定义异常处理程序不会被调用.如果重要,我的应用程序还包括一个收听GPS更新的服务,但我注销了所有接收器onPause().
这是调用堆栈MyCallingActivity.onDestroy():
Thread [<1> main] (Suspended (breakpoint at line 303 in NewPlaceDetailsActivity))
NewPlaceDetailsActivity.onDestroy() line: 303
ActivityThread.performDestroyActivity(IBinder, boolean, int, boolean) line: 2663
ActivityThread.handleDestroyActivity(IBinder, boolean, int, boolean) line: 2694
ActivityThread.access$2100(ActivityThread, IBinder, boolean, int, boolean) line: 117
BinderProxy(ActivityThread$H).handleMessage(Message) line: 968
ActivityThread$H(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 130
ActivityThread.main(String[]) line: 3687
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 507
ZygoteInit$MethodAndArgsCaller.run() line: 842
ZygoteInit.main(String[]) line: 600
NativeStart.main(String[]) …Run Code Online (Sandbox Code Playgroud) 我正在使用此代码,但我的 onActivityResult 从未被调用。我过去常常提出请求,而没有传递将图像保存到 SD 卡的额外意图,而且效果很好 -onActivityResult()会像我期望的那样被调用。但是因为我添加了 SD 卡代码 - 没有运气!
我添加(或错过)了什么?我以/sf/answers/859421881/为例。
这是我的代码,
static final int CAPTURE_IMAGE_CALLBACK = 1;
private void dispatchTakePictureIntent()
{
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photo = null;
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
{
photo = new File(android.os.Environment.getExternalStorageDirectory(), "myapp/images/" + File.separator + timeStamp + ".png");
}
else
{
photo = new File(getCacheDir(), "myapp/images/" + File.separator + timeStamp + ".png");
}
if ( photo != null)
{
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
}
if …Run Code Online (Sandbox Code Playgroud) 我的活动使用用户定义的对象来跟踪进度.当用户按下按钮并将其存储在其中一个对象中时,我需要从相机中获取图像.
问题是,有时它工作正常,但很多时候它重新初始化我的活动,因此所有对象和我的进度都丢失了.据我所知,这可能是因为相机是一个内存密集型应用程序,而在后台,操作系统会破坏我的应用程序以释放内存.
我宁愿不让我的对象Parcable,然后将它们保存到Bundle.
我修改了我的android清单,以便活动标签包含
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait"
Run Code Online (Sandbox Code Playgroud)
这是我的相机意图
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent,REQUEST_IMAGE_CAPTURE);
Run Code Online (Sandbox Code Playgroud)
这是onActivityResult方法
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK )
modifyResponseView_image();
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了更多的建议,并认为将我的活动保持在前台可能会有所帮助,但我不确定它是否会发生,也不确定如何去做.
我们将非常感谢您提供的任何帮助.应用此功能的替代方案也会有所帮助.
嗨,我正在开发 android 应用程序,我正在尝试使用设备摄像头捕获图像并将其保存到特定位置。我用以下方式尝试过:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("inside on create ", "inside on create ");
capturePhotoForRecordUpload();
}
public void capturePhotoForRecordUpload() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
File storageDir = new File(Environment.getExternalStorageDirectory().getPath() + "/MyApp");
if(!storageDir.exists())
storageDir.mkdirs();
if(!storageDir.exists())
storageDir.mkdir();
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath() + "/MyApp"+"/sample.jpg")));
startActivityForResult(takePictureIntent, 7);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
}
} …Run Code Online (Sandbox Code Playgroud)