onActivityResult数据到软糖上的输入流崩溃

时间:2015-08-23 22:15:15

标签: android camera inputstream

这是我正在使用的代码

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文件夹

感谢名单

2 个答案:

答案 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文件夹