Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在onCreate中启动摄像头导致间歇性问题_Android_Android Intent_Android Activity_Android Camera - Fatal编程技术网

Android 在onCreate中启动摄像头导致间歇性问题

Android 在onCreate中启动摄像头导致间歇性问题,android,android-intent,android-activity,android-camera,Android,Android Intent,Android Activity,Android Camera,我试图找到在MainActivity中实现按钮的最佳方法,该按钮启动camera活动并将图像返回到另一个活动。基本上,它会将图像返回给活动,以向图像添加描述。。。我认为一个好主意是在按下相机按钮时启动单个照片查看活动,并在执行任何其他操作之前从新活动启动相机活动以获取结果;但我有一个间歇性的问题,有时相机会卡在一个环路中 也许有更好的方法?我是否应该首先启动相机活动以获取结果,然后将图像作为意图传递 以下是我现在拥有的: @Override public boolean onOptionsIt

我试图找到在MainActivity中实现按钮的最佳方法,该按钮启动camera活动并将图像返回到另一个活动。基本上,它会将图像返回给活动,以向图像添加描述。。。我认为一个好主意是在按下相机按钮时启动单个照片查看活动,并在执行任何其他操作之前从新活动启动相机活动以获取结果;但我有一个间歇性的问题,有时相机会卡在一个环路中

也许有更好的方法?我是否应该首先启动相机活动以获取结果,然后将图像作为意图传递

以下是我现在拥有的:

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }else if ( id == R.id.menu_rules ){
        Intent rulesIntent = new Intent(this, RulesActivity.class);
        startActivity(rulesIntent);
        return true;
    }else if ( id == R.id.menu_import_photo ){
        //pull in an image from the gallery

        return true;
    }else if ( id == R.id.menu_item_new_photo ){
        startActivity(new Intent(MainActivity.this, SinglePhotoViewActivity.class));
    }
    return super.onOptionsItemSelected(item);
}
以及接收活动

public class SinglePhotoViewActivity extends Activity {

private static final String LOG_TAG = "Simple Camera App";
private static int TAKE_PICTURE = 1001;
private ImageView imageView;
private Uri imageUri;
private Bitmap bitmap;
private TextView textView;
private EditText editText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_single_photo_view);

    if ( bitmap == null )
        takePhoto();


}

public void takePhoto(){
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    File photo = new File(Environment
            .getExternalStoragePublicDirectory(Environment
                    //this will continually overwrite the same file
                    //need to implement a date/ time string
                    //to save as file name.
                    .DIRECTORY_PICTURES), "pic.jpg");
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
    imageUri = Uri.fromFile(photo);
    startActivityForResult(intent, TAKE_PICTURE);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode) {
        case 1001:
            if(resultCode == Activity.RESULT_OK) {
                getContentResolver().notifyChange(imageUri, null);
                imageView = (ImageView )findViewById(R.id.ivCameraImageView);
                ContentResolver contentResolver = getContentResolver();

                try {
                    bitmap = android.provider.MediaStore.Images.Media.getBitmap(contentResolver,
                        imageUri);
                    imageView.setImageBitmap(bitmap);
                } catch(Exception e) {
                    Toast.makeText(SinglePhotoViewActivity.this, "failed to load",
                             Toast.LENGTH_LONG).show();
                    Log.e(LOG_TAG, e.toString());
                }
            }
    }
}
}

您的情况与启动
ACTION\u IMAGE\u CAPTURE
intent(参见示例)时经常发生的情况类似

原因是系统可能决定销毁调用者活动(在您的情况下为
SinglePhotoViewActivity
),并在启动的活动(在您的情况下为system Camera activity)返回结果后重新创建

最终的解决方案是在调用活动中实现
onSaveInstanceState(Bundle)
。但在你的具体情况下,有一条捷径。检查
onCreate()
中的意图,如果它来自
main活动,则启动摄像头。否则,继续操作,就好像您现在就要收到activityresult()
一样