兼容Android11的手机拍照上传图片和相册选择图片功能(可直接用)

//需要的权限数组 读/写/相机
private static String[] PERMISSIONS_STORAGE = {android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};

// 头像
private ImageView imageView;
private String imgUrl;

// 初始化时,绑定控件
imageView = findViewById(R.id.imageView);

// 点击事件,底部弹出框
ActionSheetDialog dialog = new ActionSheetDialog(getActivity()).builder().setCancelable(false).setTitle("请选择")
                        .addSheetItem("相册", null, which -> {
                            //选择照片按钮
                            Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                            startActivityForResult(intent, 100);
                        }).addSheetItem("拍照", null, which -> {
                            //检查是否已经获得相机的权限
                            if (verifyPermissions(getActivity(), PERMISSIONS_STORAGE[2]) == 0) {
                                Log.e("", "提示是否要授权");
                                ActivityCompat.requestPermissions(getActivity(), PERMISSIONS_STORAGE, 3);
                            } else if (verifyPermissions(getActivity(), PERMISSIONS_STORAGE[1]) == 0) {
                                Log.e("", "提示是否要授权");
                                ActivityCompat.requestPermissions(getActivity(), PERMISSIONS_STORAGE, 3);
                            } else if (verifyPermissions(getActivity(), PERMISSIONS_STORAGE[0]) == 0) {
                                Log.e("", "提示是否要授权");
                                ActivityCompat.requestPermissions(getActivity(), PERMISSIONS_STORAGE, 3);
                            } else {
                                //已经有权限,打开相机
                                Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                                startActivityForResult(intent2, 200);
                            }
                        });
                dialog.show();

/**
     * 检查是否有对应权限
     *
     * @param activity   上下文
     * @param permission 要检查的权限
     * @return 结果标识
     */
    public int verifyPermissions(Activity activity, java.lang.String permission) {
        int Permission = ActivityCompat.checkSelfPermission(activity, permission);
        if (Permission == PackageManager.PERMISSION_GRANTED) {
            Log.e("", "已经同意权限");
            return 1;
        } else {
            Log.e("", "没有同意权限");
            return 0;
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 100 && resultCode == RESULT_OK && data != null) {//系统相册
            Uri imageData = data.getData();
            String path = getPath(imageData);
            Bitmap bitmap = BitmapFactory.decodeFile(path);
            Bitmap bitmap1 = BitmapUtils.zoomBitmap(bitmap, imageView.getWidth(),imageView.getHeight());
            Bitmap bitmap2 = BitmapUtils.createCircleBitmap(bitmap1, 0, false, 0, 0);
            //加载显示
            imageView.setImageBitmap(bitmap2);
            // bitmap图片上传到服务器(写你自己的上传方法)
            
            // bitmap图片保存到本地
            saveImage(bitmap2);
        } else if (requestCode == 200 && resultCode == RESULT_OK && data != null) {//系统相机
            Bitmap photo = null;
            Uri uri = data.getData();
            if (uri != null) {
                photo = BitmapFactory.decodeFile(uri.getPath());
            }
            if (photo == null) {
                Bundle bundle = data.getExtras();
                if (bundle != null) {
                    photo = (Bitmap) bundle.get("data");
                } else {
//                    Tools.toast(Tools.getResString(R.string.LAN299));
                    return;
                }
            }
            FileOutputStream fileOutputStream = null;
            try {
                // 获取 SD 卡根目录
                String saveDir = context.getExternalFilesDir(null).getAbsolutePath() + "/meitian_photos";
                // 新建目录
                File dir = new File(saveDir);
                if (!dir.exists()) dir.mkdir();
                // 生成文件名
                SimpleDateFormat t = new SimpleDateFormat("yyyyMMddssSSS");
                String filename = "MT" + (t.format(new Date())) + ".jpg";
                // 新建文件
                File file = new File(saveDir, filename);
                // 打开文件输出流
                fileOutputStream = new FileOutputStream(file);
                // 生成图片文件
                photo.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
                // 相片的完整路径
                imgUrl = file.getPath();
                Log.i("相册完整路径", imgUrl);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (fileOutputStream != null) {
                    try {
                        fileOutputStream.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            // bitmap图片上传到服务器(写你自己的上传方法)
            
            // bitmap图片保存到本地
            saveImage(photo);
        }
    }


    private void saveImage(Bitmap bitmap) {
        File filesDir;
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断sd卡是否挂载
            //路径1:storage/sdcard/Android/data/包名/files
            filesDir = getActivity().getExternalFilesDir("");
        } else {//手机内部存储
            //路径:data/data/包名/files
            filesDir = getActivity().getFilesDir();
        }
        FileOutputStream fos = null;
        try {
            File file = new File(filesDir, "icon.png");
            fos = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //如果本地有,就不需要再去联网去请求
    private boolean readImage() {
        File filesDir;
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // 判断sd卡是否挂载
            //路径1:storage/sdcard/Android/data/包名/files
            filesDir = getActivity().getExternalFilesDir("");
        } else {//手机内部存储
            //路径:data/data/包名/files
            filesDir = getActivity().getFilesDir();
        }
        File file = new File(filesDir, "icon.png");
        if (file.exists()) {
            //存储--->内存
            Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
            imageView.setImageBitmap(bitmap);
            return true;
        }
        return false;
    }

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    private String getPath(Uri uri) {
        int sdkVersion = Build.VERSION.SDK_INT;
        //高于4.4.2的版本
        if (sdkVersion >= 19) {
            Log.e("TAG", "uri auth: " + uri.getAuthority());
            if (isExternalStorageDocument(uri)) {
                String docId = DocumentsContract.getDocumentId(uri);
                String[] split = docId.split(":");
                String type = split[0];
                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }
            } else if (isDownloadsDocument(uri)) {
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
                        Long.valueOf(id));
                return getDataColumn(getActivity(), contentUri, null, null);
            } else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{split[1]};
                return getDataColumn(getActivity(), contentUri, selection, selectionArgs);
            } else if (isMedia(uri)) {
                String[] proj = {MediaStore.Images.Media.DATA};
                Cursor actualimagecursor = getActivity().managedQuery(uri, proj, null, null, null);
                int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                actualimagecursor.moveToFirst();
                return actualimagecursor.getString(actual_image_column_index);
            }
        } else if ("content".equalsIgnoreCase(uri.getScheme())) {
            // Return the remote address
            if (isGooglePhotosUri(uri))
                return uri.getLastPathSegment();
            return getDataColumn(getActivity(), uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }
        return null;
    }

    /**
     * uri路径查询字段
     *
     * @param context
     * @param uri
     * @param selection
     * @param selectionArgs
     * @return
     */
    public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {column};
        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }

    private boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

    public static boolean isMedia(Uri uri) {
        return "media".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is Google Photos.
     */
    public static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri.getAuthority());
    }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是java语言实现打开android热点的例子,同时兼容android 11版本: ```java import android.content.Context; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.os.Build; public class HotspotController { private WifiManager mWifiManager; public HotspotController(Context context) { mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); } public boolean setHotspot(boolean enabled) { if (mWifiManager == null) return false; if (enabled) { mWifiManager.setWifiEnabled(false); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { WifiConfiguration wifiConfiguration = new WifiConfiguration(); wifiConfiguration.SSID = "MyHotspot"; wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); wifiConfiguration.providerFriendlyName = "MyHotspot"; return mWifiManager.startLocalOnlyHotspot(wifiConfiguration) != null; } else { WifiConfiguration wifiConfiguration = new WifiConfiguration(); wifiConfiguration.SSID = "MyHotspot"; wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); try{ Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); return (Boolean) method.invoke(mWifiManager, wifiConfiguration, true); } catch (Exception e) { e.printStackTrace(); return false; } } } else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { mWifiManager.stopLocalOnlyHotspot(); return true; } else { try{ Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); return (Boolean) method.invoke(mWifiManager, null, false); } catch (Exception e) { e.printStackTrace(); return false; } } } } } ``` 在android11及以上版本,我们使用`startLocalOnlyHotspot`方法来打开热点,而在android 10以下版本,我们使用反射的方式来调用系统隐藏的方法`setWifiApEnabled`。 注意,由于系统可能会限制开启热点的功能,所以在实现过程中需要进行权限检查。另外,如果用户开启了WIFI,则在开启热点之前需要先关闭WIFI,避免两者冲突。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值