在 Android 应用程序中拍照并将其保存到图库中

Joã*_*sta 2 java android android-camera

我正在开发一个 Android 应用程序,有时我必须拍照并将其保存到图库中。相机打开并拍摄照片,但不会将其保存到图库中。这是我的代码:

public class CameraActivity extends AppCompatActivity {

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camara);
        dispatchTakePictureIntent();
    }

    static final int REQUEST_IMAGE_CAPTURE = 1;

    @RequiresApi(api = Build.VERSION_CODES.M)
    private void dispatchTakePictureIntent() {


        if (checkSelfPermission(Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.CAMERA},
                    MY_CAMERA_REQUEST_CODE);
        }
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }


    private static final int MY_CAMERA_REQUEST_CODE = 100;


    @Override

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == MY_CAMERA_REQUEST_CODE) {

            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Toast.makeText(this, "camera permission granted", Toast.LENGTH_LONG).show();

            } else {

                Toast.makeText(this, "camera permission denied", Toast.LENGTH_LONG).show();

            }

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".CameraActivity">

</androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

谁能帮我?我搜索过其他类似的问题,但都无法帮助我。谢谢大家,祝您度过愉快的一天。

Aje*_*ett 5

首先在你的xml文件夹中创建一个provider文件

\n\n

\xc2\xa0

\n\n
<provider\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 android:name="android.support.v4.content.FileProvider"\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 android:authorities="com.example.android.fileprovider"\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 android:exported="false"\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 android:grantUriPermissions="true">\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 <meta-data\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 android:name="android.support.FILE_PROVIDER_PATHS"\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 android:resource="@xml/file_paths"></meta-data>\n\xc2\xa0 \xc2\xa0 </provider>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是提供商的代码

\n\n
<?xml version="1.0" encoding="utf-8"?>\n<paths xmlns:android="http://schemas.android.com/apk/res/android">\n\xc2\xa0 \xc2\xa0 <external-files-path name="my_images" path="Android/data/com.example.package.name/files/Pictures" />\n</paths>\n
Run Code Online (Sandbox Code Playgroud)\n\n

在清单文件中添加此行

\n\n
<uses-feature android:name="android.hardware.camera"\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 android:required="true" />\n\n<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

创建将打开相机的拍照意图

\n\n
static final int REQUEST_IMAGE_CAPTURE = 1;\n\nprivate void dispatchTakePictureIntent() {\n\xc2\xa0 \xc2\xa0 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);\n\xc2\xa0 \xc2\xa0 if (takePictureIntent.resolveActivity(getPackageManager()) != null) {\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);\n\xc2\xa0 \xc2\xa0 }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在获取点击图像的缩略图

\n\n
@Override\nprotected void onActivityResult(int requestCode, int resultCode, Intent data) {\n\xc2\xa0 \xc2\xa0 if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 Bundle extras = data.getExtras();\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 Bitmap imageBitmap = (Bitmap) extras.get("data");\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 imageView.setImageBitmap(imageBitmap);\n\xc2\xa0 \xc2\xa0 }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

将图片保存到图库的代码,图像将保存在图片文件夹中

\n\n
String currentPhotoPath;\n\nprivate File createImageFile() throws IOException {\n\xc2\xa0 \xc2\xa0 // Create an image file name\n\xc2\xa0 \xc2\xa0 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());\n\xc2\xa0 \xc2\xa0 String imageFileName = "JPEG_" + timeStamp + "_";\n\xc2\xa0 \xc2\xa0 File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);\n\xc2\xa0 \xc2\xa0 File image = File.createTempFile(\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 imageFileName, \xc2\xa0/* prefix */\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 ".jpg", \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 /* suffix */\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 storageDir \xc2\xa0 \xc2\xa0 \xc2\xa0/* directory */\n\xc2\xa0 \xc2\xa0 );\n\n\xc2\xa0 \xc2\xa0 // Save a file: path for use with ACTION_VIEW intents\n\xc2\xa0 \xc2\xa0 currentPhotoPath = image.getAbsolutePath();\n\xc2\xa0 \xc2\xa0 return image;\n}\n\n\nstatic final int REQUEST_TAKE_PHOTO = 1;\n\nprivate void dispatchTakePictureIntent() {\n\xc2\xa0 \xc2\xa0 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);\n\xc2\xa0 \xc2\xa0 // Ensure that there\'s a camera activity to handle the intent\n\xc2\xa0 \xc2\xa0 if (takePictureIntent.resolveActivity(getPackageManager()) != null) {\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 // Create the File where the photo should go\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 File photoFile = null;\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 try {\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 photoFile = createImageFile();\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 } catch (IOException ex) {\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 // Error occurred while creating the File\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 ...\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 }\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 // Continue only if the File was successfully created\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 if (photoFile != null) {\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 Uri photoURI = FileProvider.getUriForFile(this,\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 "com.example.android.fileprovider",\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 photoFile);\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 }\n\xc2\xa0 \xc2\xa0 }\n}\n\n\nprivate void galleryAddPic() {\n\xc2\xa0 \xc2\xa0 Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);\n\xc2\xa0 \xc2\xa0 File f = new File(currentPhotoPath);\n\xc2\xa0 \xc2\xa0 Uri contentUri = Uri.fromFile(f);\n\xc2\xa0 \xc2\xa0 mediaScanIntent.setData(contentUri);\n\xc2\xa0 \xc2\xa0 this.sendBroadcast(mediaScanIntent);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

获取图片的代码

\n\n
private void setPic() {\n\xc2\xa0 \xc2\xa0 // Get the dimensions of the View\n\xc2\xa0 \xc2\xa0 int targetW = imageView.getWidth();\n\xc2\xa0 \xc2\xa0 int targetH = imageView.getHeight();\n\n\xc2\xa0 \xc2\xa0 // Get the dimensions of the bitmap\n\xc2\xa0 \xc2\xa0 BitmapFactory.Options bmOptions = new BitmapFactory.Options();\n\xc2\xa0 \xc2\xa0 bmOptions.inJustDecodeBounds = true;\n\n\xc2\xa0 \xc2\xa0 int photoW = bmOptions.outWidth;\n\xc2\xa0 \xc2\xa0 int photoH = bmOptions.outHeight;\n\n\xc2\xa0 \xc2\xa0 // Determine how much to scale down the image\n\xc2\xa0 \xc2\xa0 int scaleFactor = Math.min(photoW/targetW, photoH/targetH);\n\n\xc2\xa0 \xc2\xa0 // Decode the image file into a Bitmap sized to fill the View\n\xc2\xa0 \xc2\xa0 bmOptions.inJustDecodeBounds = false;\n\xc2\xa0 \xc2\xa0 bmOptions.inSampleSize = scaleFactor;\n\xc2\xa0 \xc2\xa0 bmOptions.inPurgeable = true;\n\n\xc2\xa0 \xc2\xa0 Bitmap bitmap = BitmapFactory.decodeFile(currentPhotoPath, bmOptions);\n\xc2\xa0 \xc2\xa0 imageView.setImageBitmap(bitmap);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 您可以设置一个按钮并调用dispatchTakePictureIntent() (2认同)