首页 » Android » 正文

拍照并显示

  1. 首先布局是一个拍照的按钮和拍完显示照片的ImageView
    activity_main:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/take_photo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="拍照" />

    <ImageView
        android:id="@+id/picture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />
</LinearLayout>
  1. MainActivity,在这里要创建文件,得到文件的Uri,然后将Uri给拍照的Activity,其中24及24版本以上的因为加强安全的缘故,需要使用内容提供器,在拍完照后要回调将照片进行显示。
public class MainActivity extends AppCompatActivity {
    private ImageView picture;
    private Uri mImageUri;
    private static final int CAMERA_CODE = 111;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button takePhoto = findViewById(R.id.take_photo);
        picture = findViewById(R.id.picture);
        takePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //在相应的目录下创建文件
                File outputImage = new File(getExternalCacheDir() + "outputImage.jpg");

                //这个文件如果存在,就删除重新创建
                try {
                    if (outputImage.exists()) {
                        outputImage.delete();
                    }
                    outputImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                //24版本的sdk要求高了,需要使用FileProvider来共享文件的目录
                //这里从那个内容提供器来得到文件Uri
                if (Build.VERSION.SDK_INT >= 24) {
                    mImageUri = FileProvider.getUriForFile(MainActivity.this,
                            "com.example.cameraalbumtest.fileprovider", outputImage);
                }
                //24以下的就没这么多要求了,直接得到Uri
                else {
                    mImageUri = Uri.fromFile(outputImage);
                }
                //启动拍照的活动,并且将输出Uri设置为我们创建的文件
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
                startActivityForResult(intent, CAMERA_CODE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        switch (requestCode) {
            //创建完成后,我们将图片在ImageView中进行展示
            case CAMERA_CODE:
                if (resultCode == RESULT_OK) {
                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
                                .openInputStream(mImageUri));
                        picture.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
            default:
                break;
        }
    }
}
  1. 在Minafest中申明内容提供器,内容是:
<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.example.cameraalbumtest.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/>
        </provider>

其中使用的是FileProvider,deta-data中的file_paths需要创建,在res下创建xml文件夹,在xml文件夹下创建file_paths.xml文件,内容是

<?xml version="1.0" encoding="utf-8"?>
<paths
    xmlns:android="http://schemas.android.com/apk/res/android">
    <paths>
        <external-path
            name="my_images"
            path="storage"/>
    </paths>


</paths>

name属性这里可以随便填,path所代表的就是我们共享的目录,这个可以通过打印出照片目录来查看。

发表评论