Java 使用相机拍照,并储存在内部而不是外部存储器中

Java 使用相机拍照,并储存在内部而不是外部存储器中,java,android,android-studio,photo-gallery,Java,Android,Android Studio,Photo Gallery,我正试图用内置的安卓摄像头拍照。我一直在学习一个教程,它教我如何捕获图像,但是它只教我如何捕获图像并将其存储到SD卡上。目前,每当试图将代码用于内部存储时,应用程序就会崩溃。下面是我拥有的代码的一部分,我不确定如何更改它以使内部存储正常工作 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout

我正试图用内置的安卓摄像头拍照。我一直在学习一个教程,它教我如何捕获图像,但是它只教我如何捕获图像并将其存储到SD卡上。目前,每当试图将代码用于内部存储时,应用程序就会崩溃。下面是我拥有的代码的一部分,我不确定如何更改它以使内部存储正常工作

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    _image = ( ImageView ) findViewById( R.id.image );
    _field = ( TextView ) findViewById( R.id.field );
    _button = ( Button ) findViewById( R.id.button );
    _button.setOnClickListener( new ButtonClickHandler() );

     _path = Environment.getExternalStorageDirectory() + "/images/make_machine_example.jpg";
}
protected void startCameraActivity()
{
    File file = new File( _path );
    Uri outputFileUri = Uri.fromFile( file );

    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE );
    intent.putExtra( MediaStore.EXTRA_OUTPUT, outputFileUri );

    startActivityForResult( intent, 0 );
}

您不能为第三方应用程序提供指向您应用程序内部存储的路径,并期望其他应用程序能够使用它,因为其他应用程序没有读取或写入权限来使用您的内部存储

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    _image = ( ImageView ) findViewById( R.id.image );
    _field = ( TextView ) findViewById( R.id.field );
    _button = ( Button ) findViewById( R.id.button );
    _button.setOnClickListener( new ButtonClickHandler() );

     _path = Environment.getExternalStorageDirectory() + "/images/make_machine_example.jpg";
}
protected void startCameraActivity()
{
    File file = new File( _path );
    Uri outputFileUri = Uri.fromFile( file );

    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE );
    intent.putExtra( MediaStore.EXTRA_OUTPUT, outputFileUri );

    startActivityForResult( intent, 0 );
}
简单的解决方法是使用外部存储器存储图片,然后将其复制到内部存储器上所需的位置,在复制完成后删除外部存储器上的原件

可能可行的解决方案是使用安全的
文件提供程序
访问摄像头应用程序的内部存储。这绝对适用于允许其他应用读取您的内部存储,
FileProvider
似乎支持写入操作,尽管我从未尝试过将其用于写入操作,更不用说使用摄像头应用了


it-will-work-but-oy-it-is-a-lot-work解决方案是使用
android.hardware.Camera
和/或
android.hardware.camera2
自己拍照,而不是调用第三方应用程序。

你不能给第三方应用程序一个指向你应用程序内部存储的路径,并期望其他应用程序能够使用它,因为另一个应用程序没有读取或写入权限来处理您的内部存储

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    _image = ( ImageView ) findViewById( R.id.image );
    _field = ( TextView ) findViewById( R.id.field );
    _button = ( Button ) findViewById( R.id.button );
    _button.setOnClickListener( new ButtonClickHandler() );

     _path = Environment.getExternalStorageDirectory() + "/images/make_machine_example.jpg";
}
protected void startCameraActivity()
{
    File file = new File( _path );
    Uri outputFileUri = Uri.fromFile( file );

    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE );
    intent.putExtra( MediaStore.EXTRA_OUTPUT, outputFileUri );

    startActivityForResult( intent, 0 );
}
简单的解决方法是使用外部存储器存储图片,然后将其复制到内部存储器上所需的位置,在复制完成后删除外部存储器上的原件

可能可行的解决方案是使用安全的
文件提供程序
访问摄像头应用程序的内部存储。这绝对适用于允许其他应用读取您的内部存储,
FileProvider
似乎支持写入操作,尽管我从未尝试过将其用于写入操作,更不用说使用摄像头应用了


it-will-work-but-oy-it-is-a-lot-work解决方案是使用
android.hardware.Camera
和/或
android.hardware.camera2
,而不是调用第三方应用程序,自己拍摄照片。

目前,你的应用程序已经厌倦了存储在外部存储器(getExternalStorageDirectory())这绝大多数不是可移动的micro SD卡。除了可移动和外部存储器,android设备也有内部存储器。要让camara应用程序将图片放入您的私有内部存储,您可以提供一个内容提供商。

目前,您的应用程序只能存储在外部存储(getExternalStorageDirectory())中,而外部存储大多不是可移动的micro SD卡。除了可移动和外部存储器,android设备也有内部存储器。要让camara应用程序将图片放入您的私有内部存储,您可以提供一个contentprovider。

如果外部存储位置中存在“images”目录,您的代码应该可以工作。但它可能会在活动结果中崩溃。是吗?您没有为此显示代码。您应该发布日志,因为您在那里看到了异常/错误。如果“images”目录存在于该外部存储位置中,那么您的代码应该可以工作。但它可能会在活动结果中崩溃。是吗?您没有为此显示代码。你应该发布日志,因为你看到了异常/错误。为什么你说FileProvider选项是“也许它可以工作”的解决方案?您对使用它有何保留?@marienke:某些相机应用程序将不支持带有
内容
方案的
Uri
值,就像您从
文件提供商
获得的那样。例如,直到一年前,谷歌自己的摄像头应用程序还不支持它们。作为开发人员的问题是,您无法知道给定的
操作\u图像\u捕获
活动是否支持
内容
。为什么您会说FileProvider选项是“可能可行的解决方案”?您对使用它有何保留?@marienke:某些相机应用程序将不支持带有
内容
方案的
Uri
值,就像您从
文件提供商
获得的那样。例如,直到一年前,谷歌自己的摄像头应用程序还不支持它们。作为开发人员的问题是,您无法知道给定的
操作\u图像\u捕获
活动是否支持
内容