【问题标题】:Android app using camera, photo disappears after screen rotation使用相机的Android应用程序,屏幕旋转后照片消失
【发布时间】:2014-06-22 15:45:47
【问题描述】:

该应用程序的目的是拍摄一张照片,然后让它出现在屏幕上。我已将屏幕旋转锁定为纵向,但在拍摄照片并将其附加到应用程序屏幕后,手机屏幕能够再次旋转,如果发生这种情况,图像就会消失。我该如何解决?这是代码

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());
            }
        }
    }
  }
}

【问题讨论】:

    标签: android camera rotation photo


    【解决方案1】:

    当屏幕方向改变时,系统会重启activity(调用onDestroy()然后onCreate())。所以我相信你需要在重启后再次设置图像。

    此链接http://developer.android.com/guide/topics/resources/runtime-changes.html 提供了一些有关如何处理此问题的有用信息。最简单的方法可能是将图像 uri 存储在 onSaveInstanceState() 中,然后在 onRestoreInstanceState() 中恢复图像。

    【讨论】:

      【解决方案2】:

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

      1. 在 values 中创建一个 xml 文件并将其命名为 ids.xml
      2. 像这样在那里创建您的 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>
        
      3. 设置标识:

        button_1.setId(R.id.button_1_id);
        ...
        

      【讨论】:

        【解决方案3】:

        这是一个快速修复.. 它并没有真正解决问题,但是您可以通过将此代码添加到 MainActivity 所在的清单中来阻止屏幕改变方向.. 只需添加这一行..

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

        【讨论】:

          猜你喜欢
          • 2015-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-15
          • 2015-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多