Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.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应用程序使用摄像头,屏幕旋转后照片消失_Android_Camera_Rotation_Photo - Fatal编程技术网

Android应用程序使用摄像头,屏幕旋转后照片消失

Android应用程序使用摄像头,屏幕旋转后照片消失,android,camera,rotation,photo,Android,Camera,Rotation,Photo,该应用程序的目的是抓拍一张照片,然后将其显示在屏幕上。我已将屏幕旋转锁定为“纵向”,但在拍照并连接到应用程序屏幕后,手机屏幕可以再次旋转,如果发生这种情况,图像将消失。我该如何解决这个问题?这是密码 public class MainActivity extends Activity { private static String logtag = "CameraApp"; private static int TAKE_PICTURE = 1; private Uri imageUri;

该应用程序的目的是抓拍一张照片,然后将其显示在屏幕上。我已将屏幕旋转锁定为“纵向”,但在拍照并连接到应用程序屏幕后,手机屏幕可以再次旋转,如果发生这种情况,图像将消失。我该如何解决这个问题?这是密码

public class MainActivity extends Activity {

private static String logtag = "CameraApp";
private static int TAKE_PICTURE = 1;
private Uri imageUri;

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

    Button cameraButton = (Button)findViewById(R.id.button_camera);
    cameraButton.setOnClickListener(cameraListener);
}

private OnClickListener cameraListener = new OnClickListener() {
    public void onClick(View v) {
        takePhoto(v);
    }
};

public void takePhoto(View v) {
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    File photo = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "pic.jpg");
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
    imageUri = Uri.fromFile(photo);
    startActivityForResult(intent, TAKE_PICTURE);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode) {
    case 1:
        if(resultCode == Activity.RESULT_OK) {
            Uri selectedImage = imageUri;
            getContentResolver().notifyChange(selectedImage, null);
            ImageView imageView = (ImageView)findViewById(R.id.image_view_camera);
            ContentResolver cr = getContentResolver();
            Bitmap bitmap;
            try {
                bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, selectedImage);
                imageView.setImageBitmap(bitmap);
                Toast.makeText(MainActivity.this, selectedImage.toString(), Toast.LENGTH_LONG).show();
            } catch(Exception e) {
                Toast.makeText(MainActivity.this, "failed to load", Toast.LENGTH_LONG).show();
                Log.e(logtag, e.toString());
            }
        }
    }
  }
}

当更改屏幕方向时,系统将重新启动活动(调用onDestroy()然后调用onCreate()。因此,我认为您需要在重新启动后重新设置映像


此链接提供了一些有关如何处理此问题的有用信息。最简单的方法可能是将图像uri存储在onSaveInstanceState()中,然后在onRestoreInstanceState()中还原图像。

这是一个快速解决方案。。这并不能真正解决问题,但你可以通过将此代码添加到MainActivity所在的清单中来阻止屏幕改变方向。。只要加上这一行

<activity
        ...
        android:screenOrientation="portrait" 
        ...>
</activity>

为每个视图设置Id,以防止在屏幕更改方向时丢失数据

  • 在values中创建一个xml文件,并将其命名为ids.xml
  • 像这样在那里创建您的ID

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <item name="button_1_id" type="id"/>
        <item name="button_2_id" type="id"/>
        <item name="imageView_id" type="id"/>
        ....
    </resources>
    
  • button_1.setId(R.id.button_1_id);
    ...