美文网首页
调用摄像头、FileProvider

调用摄像头、FileProvider

作者: 爱做梦的严重精神病患者 | 来源:发表于2018-10-11 23:00 被阅读0次

    1.通知的更多效果

     Notification notification = new NotificationCompat.Builder(context)

    • 设置声音 .setSound(Uri)
    • 设置震动 .setVibrate()
    • 设置提示灯 .setLight()
    • 设置重要程度 .setPriority()

    2.调用摄像头拍照

    想要调用摄像头拍照,需要完成如下几个步骤:

    1. 创建File,用于存储拍照后的图片
    2. 使用FileProvider获得图片的Uri
    3. 将Uri参数传入,启动相机程序
    4. 将拍摄的照片显示出来

    FileProvider是一种特殊的内容提供器,它使用了和内容提供器类似的机制来对数据进行保护,可以选择性地将封装过的Uri共享给外部,从而提高了应用的安全性。

    public class MainActivity extends AppCompatActivity {
        private static final String AUTHORITY = "com.futuring.camerademo.fileprovider";
        private static final int TAKE_PHOTO = 1;
        private Button takePhoto;
        private ImageView picture;
        private Uri imageUri;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            takePhoto = findViewById(R.id.take_photo);
            picture = findViewById(R.id.picture);
    
            takePhoto.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                //第一步 创建File,用于存储拍照后的图片
                    File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
    
                    if (outputImage.exists()) {
                        outputImage.delete();
                    }
                    try {
                        outputImage.createNewFile();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    //第二步   获得图片的Uri
                    imageUri = FileProvider.getUriForFile(MainActivity.this, AUTHORITY, outputImage);
                    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                    //第三步    将Uri参数传入,启动相机程序
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    //返回可执行的activity的相关信息
                    List<ResolveInfo> cameraActivities = getActivity().getPackageManager()
                         .queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY)
                    //给可执行intent的活动临时授权
                    for (ResolveInfo activity : cameraActivities) {
                          getActivity().grantUriPermission(activity.activityInfo.packageName,
                                               imageUri ,Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                        }
    
                    startActivityForResult(intent, TAKE_PHOTO);
                }
            });
        }
    
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            switch (requestCode) {
                case TAKE_PHOTO:
                    if (resultCode == RESULT_OK) {
                        try {
                            //第四步     将拍摄的照片显示出来
                            Bitmap bitmap = BitmapFactory.decodeStream
                                    (getContentResolver().openInputStream(imageUri));
                            picture.setImageBitmap(bitmap);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    break;
    
                    default:
                        break;
            }
        }
    }
    
    
    //AndroidMainfest.xml
    <provider
                android:authorities="com.futuring.camerademo.fileprovider"
                android:exported="false"
                android:name="android.support.v4.content.FileProvider"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_path"
                    />
            </provider>
    
    //   res/xml/file_path
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path
            name="output_image"
            path="" />    //表示将整个external-path路径下的文件共享
    </paths>
    

    相关文章

      网友评论

          本文标题:调用摄像头、FileProvider

          本文链接:https://www.haomeiwen.com/subject/plyiaftx.html