Selaa lähdekoodia

增加动态权限

316044749 7 vuotta sitten
vanhempi
commit
d4cfcddd47

+ 14 - 0
app/src/main/AndroidManifest.xml

@@ -22,6 +22,9 @@
     <!--用于申请调用A-GPS模块-->
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
 
+    <uses-permission android:name="android.permission.CAMERA"/>
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+
     <application
         android:name=".application.STApplication"
         android:allowBackup="true"
@@ -203,6 +206,17 @@
             android:exported="true"
             android:launchMode="singleTop" />
 
+        <!-- android:authorities="包名.fileprovider"将“包名”替换为实际包名 -->
+        <provider
+            android:name="android.support.v4.content.FileProvider"
+            android:authorities="${applicationId}.fileprovider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_paths" />
+        </provider>
+
     </application>
 
 </manifest>

+ 127 - 92
app/src/main/java/com/ynstkz/shitu/android/activity/AlterHeadpicActivity.java

@@ -1,13 +1,25 @@
 package com.ynstkz.shitu.android.activity;
 
+import android.Manifest;
+import android.app.AlertDialog;
 import android.app.ProgressDialog;
+import android.content.ComponentName;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
 import android.provider.MediaStore;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.FileProvider;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
 import android.text.TextUtils;
@@ -20,6 +32,7 @@ import com.bumptech.glide.request.target.BitmapImageViewTarget;
 import com.common.library.okhttp.callback.Callback;
 import com.google.gson.Gson;
 import com.tencent.connect.UserInfo;
+import com.ynstkz.shitu.android.BuildConfig;
 import com.ynstkz.shitu.android.R;
 import com.ynstkz.shitu.android.application.STApplication;
 import com.ynstkz.shitu.android.application.STSign;
@@ -38,6 +51,7 @@ import org.greenrobot.eventbus.EventBus;
 import java.io.File;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Locale;
 
 import butterknife.Bind;
 import okhttp3.Call;
@@ -69,12 +83,9 @@ public class AlterHeadpicActivity extends TitleBarActivity implements View.OnCli
 
     private SelectPicDialog selectPicDialog;
     private ProgressDialog progressDialog;
-
-    private String protraitPath;
-    private File protraitFile;
-    private Uri origUri;
+    private File mOutputImage;
     private Uri cropUri;
-    private final static int CROP = 200;
+    private File uploadFile;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -147,99 +158,106 @@ public class AlterHeadpicActivity extends TitleBarActivity implements View.OnCli
      * 相机拍照
      */
     private void startActionCamera() {
-        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
-        intent.putExtra(MediaStore.EXTRA_OUTPUT, getCameraTempFile());
-        startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYCAMERA);
-    }
+        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
+            //权限发生了改变 true  //  false 小米
+            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
+                new AlertDialog.Builder(this).setTitle("提示")
+                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
+                                // 请求授权
+                                ActivityCompat.requestPermissions(AlterHeadpicActivity.this, new String[]{Manifest.permission.CAMERA}, 1);
+                            }
+                        })
+                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
 
-    /**
-     * 拍照保存的绝对路径
-     */
-    private Uri getCameraTempFile() {
-        String storageState = Environment.getExternalStorageState();
-        if (storageState.equals(Environment.MEDIA_MOUNTED)) {
-            File savedir = new File(getFileSavePath());
-            if (!savedir.exists()) {
-                savedir.mkdirs();
+                            }
+                        }).create().show();
+            } else {
+                ActivityCompat.requestPermissions(AlterHeadpicActivity.this, new String[]{Manifest.permission.CAMERA}, 1);
             }
         } else {
-            showToast("无法保存上传的头像,请检查SD卡是否挂载");
-            return null;
+            closePopDialog();
+            String pictureName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault()).format(new Date()) +
+                    "-" + System.currentTimeMillis() + ".jpg";
+            mOutputImage = new File(getExternalCacheDir(), pictureName);
+            Uri imageUri;
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                imageUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileprovider", mOutputImage);
+            } else {
+                imageUri = Uri.fromFile(mOutputImage);
+            }
+            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
+            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //图片存储的地方.
+            intent.putExtra("return-data", false);
+            intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
+            intent.putExtra("noFaceDetection", true);
+            ComponentName componentName = intent.resolveActivity(getPackageManager());
+            if (componentName != null) {
+                startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYCAMERA);
+            }
         }
-        String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss")
-                .format(new Date());
-        // 照片命名
-        String cropFileName = "st_camera_" + timeStamp + ".jpg";
-        // 裁剪头像的绝对路径
-        protraitPath = getFileSavePath() + cropFileName;
-        protraitFile = new File(protraitPath);
-        cropUri = Uri.fromFile(protraitFile);
-        this.origUri = this.cropUri;
-        return this.cropUri;
-    }
-
-    /**
-     * 获取文件保存路径
-     *
-     * @return
-     */
-    private String getFileSavePath() {
-        return Environment
-                .getExternalStorageDirectory().getAbsolutePath()
-                + "/shitu/Portrait/";
     }
 
     /**
      * 拍照后裁剪
-     *
-     * @param data 原始图片
-     *             裁剪后图片
      */
-    private void startActionCrop(Uri data) {
+    private void startActionCrop(File file) {
+
+        String cropImageName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault()).format(new Date()) +
+                "-1-" + System.currentTimeMillis() + ".jpg";
+        File cropFile = new File(getExternalCacheDir(), cropImageName);
+        //注意到此处使用的file:// uri类型.
+        cropUri = Uri.fromFile(cropFile);
         Intent intent = new Intent("com.android.camera.action.CROP");
-        intent.setDataAndType(data, "image/*");
-        intent.putExtra("output", this.getUploadTempFile(data));
+        Uri sourceUri;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            sourceUri = getImageContentUri(this, file);
+        } else {
+            sourceUri = Uri.fromFile(file);
+        }
+        intent.setDataAndType(sourceUri, "image/*");
         intent.putExtra("crop", "true");
-        intent.putExtra("aspectX", 1);// 裁剪框比例
+        intent.putExtra("aspectX", 1);
         intent.putExtra("aspectY", 1);
-        intent.putExtra("outputX", CROP);// 输出图片大小
-        intent.putExtra("outputY", CROP);
-        intent.putExtra("scale", true);// 去黑边
-        intent.putExtra("scaleUpIfNeeded", true);// 去黑边
-        startActivityForResult(intent,
-                REQUEST_CODE_GETIMAGE_BYSDCARD);
+        intent.putExtra("outputX", 200);
+        intent.putExtra("outputY", 200);
+        intent.putExtra("return-data", false);
+        intent.putExtra(MediaStore.EXTRA_OUTPUT, cropUri);
+        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
+        intent.putExtra("noFaceDetection", true);
+        ComponentName componentName = intent.resolveActivity(getPackageManager());
+        if (componentName != null) {
+            startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYSDCARD);
+        }
     }
 
-    // 裁剪头像的绝对路径
-    private Uri getUploadTempFile(Uri uri) {
-        String storageState = Environment.getExternalStorageState();
-        if (storageState.equals(Environment.MEDIA_MOUNTED)) {
-            File savedir = new File(getFileSavePath());
-            if (!savedir.exists()) {
-                savedir.mkdirs();
-            }
+    //获取文件的Content uri路径
+    public static Uri getImageContentUri(Context context, File imageFile) {
+        String filePath = imageFile.getAbsolutePath();
+        Cursor cursor = context.getContentResolver().query(
+                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
+                new String[]{MediaStore.Images.Media._ID},
+                MediaStore.Images.Media.DATA + "=? ",
+                new String[]{filePath}, null);
+
+        if (cursor != null && cursor.moveToFirst()) {
+            int id = cursor.getInt(cursor
+                    .getColumnIndex(MediaStore.MediaColumns._ID));
+            Uri baseUri = Uri.parse("content://media/external/images/media");
+            return Uri.withAppendedPath(baseUri, "" + id);
         } else {
-            showToast("无法保存上传的头像,请检查SD卡是否挂载");
-            return null;
-        }
-        String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss")
-                .format(new Date());
-        String thePath = ImageUtils.getAbsolutePathFromNoStandardUri(uri);
-
-        // 如果是标准Uri
-        if (TextUtils.isEmpty(thePath)) {
-            thePath = ImageUtils.getAbsoluteImagePath(this, uri);
+            if (imageFile.exists()) {
+                ContentValues values = new ContentValues();
+                values.put(MediaStore.Images.Media.DATA, filePath);
+                return context.getContentResolver().insert(
+                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
+            } else {
+                return null;
+            }
         }
-        String ext = FileUtils.getFileFormat(thePath);
-        ext = TextUtils.isEmpty(ext) ? "jpg" : ext;
-        // 照片命名
-        String cropFileName = "st_crop_" + timeStamp + "." + ext;
-        // 裁剪头像的绝对路径
-        protraitPath = getFileSavePath() + cropFileName;
-        protraitFile = new File(protraitPath);
-
-        cropUri = Uri.fromFile(protraitFile);
-        return this.cropUri;
     }
 
     /**
@@ -249,19 +267,18 @@ public class AlterHeadpicActivity extends TitleBarActivity implements View.OnCli
         Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
         intent.addCategory(Intent.CATEGORY_OPENABLE);
         intent.setType("image/*");
-        startActivityForResult(Intent.createChooser(intent, "选择图片"), REQUEST_CODE_GETIMAGE_BYCROP);
+        ComponentName componentName = intent.resolveActivity(getPackageManager());
+        if (componentName != null) {
+            startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYCROP);
+        }
     }
 
-
     /**
      * 上传头像
      */
     private void userResetHeadpic() {
 
-        if (!TextUtils.isEmpty(protraitPath) && protraitFile.exists()) {
-
-        } else {
-            showToast("图像不存在,上传失败");
+        if(uploadFile == null){
             return;
         }
 
@@ -269,7 +286,7 @@ public class AlterHeadpicActivity extends TitleBarActivity implements View.OnCli
         progressDialog.setMessage("正在提交...");
         progressDialog.show();
 
-        RequestGroup.userResetHeadpic(protraitFile, new Callback() {
+        RequestGroup.userResetHeadpic(uploadFile, new Callback() {
             @Override
             public Object parseNetworkResponse(Response response, int id) throws Exception {
                 return new Gson().fromJson(response.body().string(), BaseBean.class);
@@ -288,7 +305,7 @@ public class AlterHeadpicActivity extends TitleBarActivity implements View.OnCli
                 if (baseBean != null) {
                     showToast(baseBean.getMsg());
                     if ("200".equals(baseBean.getCode())) {
-                        Glide.with(AlterHeadpicActivity.this).load(protraitFile).asBitmap().into(new BitmapImageViewTarget(ivHeadPic){
+                        Glide.with(AlterHeadpicActivity.this).load(uploadFile).asBitmap().into(new BitmapImageViewTarget(ivHeadPic){
 
                             @Override
                             protected void setResource(Bitmap resource) {
@@ -305,16 +322,34 @@ public class AlterHeadpicActivity extends TitleBarActivity implements View.OnCli
     }
 
     @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+
+        if (requestCode == 1) {
+            // camear 权限回调
+            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                closePopDialog();
+                startActionCamera();
+            }
+        }
+    }
+
+    @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         switch (requestCode) {
             case REQUEST_CODE_GETIMAGE_BYCAMERA:
-                startActionCrop(origUri);// 拍照后裁剪
+                startActionCrop(mOutputImage);// 拍照后裁剪
             case REQUEST_CODE_GETIMAGE_BYCROP:
                 if (data != null) {
-                    startActionCrop(data.getData());// 选图后裁剪
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+                        startActionCrop(new File(FileUtils.parsePicturePath(AlterHeadpicActivity.this, data.getData())));// 选图后裁剪
+                    }
                 }
                 break;
             case REQUEST_CODE_GETIMAGE_BYSDCARD:
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+                    uploadFile = new File(FileUtils.parsePicturePath(AlterHeadpicActivity.this, cropUri));
+                }
                 userResetHeadpic();// 上传新照片
                 break;
         }

+ 113 - 86
app/src/main/java/com/ynstkz/shitu/android/activity/OrgWriteCommentActivity.java

@@ -1,13 +1,24 @@
 package com.ynstkz.shitu.android.activity;
 
+import android.Manifest;
+import android.app.AlertDialog;
 import android.app.ProgressDialog;
+import android.content.ComponentName;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
 import android.provider.MediaStore;
 import android.support.annotation.Nullable;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.FileProvider;
 import android.text.TextUtils;
 import android.view.View;
 import android.widget.AdapterView;
@@ -19,6 +30,7 @@ import android.widget.TextView;
 
 import com.common.library.okhttp.callback.Callback;
 import com.google.gson.Gson;
+import com.ynstkz.shitu.android.BuildConfig;
 import com.ynstkz.shitu.android.R;
 import com.ynstkz.shitu.android.adapter.OrgCommentPicAdapter;
 import com.ynstkz.shitu.android.base.TitleBarActivity;
@@ -34,6 +46,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 import butterknife.Bind;
@@ -75,11 +88,9 @@ public class OrgWriteCommentActivity extends TitleBarActivity implements View.On
     private OrgCommentPicAdapter orgCommentPicAdapter;
     private ProgressDialog progressDialog;
 
-    private String protraitPath;
-    private File protraitFile;
-    private Uri origUri;
+    private File mOutputImage;
     private Uri cropUri;
-    private final static int CROP = 200;
+    private File uploadFile;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -200,99 +211,106 @@ public class OrgWriteCommentActivity extends TitleBarActivity implements View.On
      * 相机拍照
      */
     private void startActionCamera() {
-        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
-        intent.putExtra(MediaStore.EXTRA_OUTPUT, getCameraTempFile());
-        startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYCAMERA);
-    }
-
-    /**
-     * 拍照保存的绝对路径
-     */
-    private Uri getCameraTempFile() {
-        String storageState = Environment.getExternalStorageState();
-        if (storageState.equals(Environment.MEDIA_MOUNTED)) {
-            File savedir = new File(getFileSavePath());
-            if (!savedir.exists()) {
-                savedir.mkdirs();
+        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
+            //权限发生了改变 true  //  false 小米
+            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
+                new AlertDialog.Builder(this).setTitle("提示")
+                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
+                                // 请求授权
+                                ActivityCompat.requestPermissions(OrgWriteCommentActivity.this, new String[]{Manifest.permission.CAMERA}, 1);
+                            }
+                        })
+                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
+
+                            }
+                        }).create().show();
+            } else {
+                ActivityCompat.requestPermissions(OrgWriteCommentActivity.this, new String[]{Manifest.permission.CAMERA}, 1);
             }
         } else {
-            showToast("无法保存上传的头像,请检查SD卡是否挂载");
-            return null;
+            closePopDialog();
+            String pictureName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault()).format(new Date()) +
+                    "-" + System.currentTimeMillis() + ".jpg";
+            mOutputImage = new File(getExternalCacheDir(), pictureName);
+            Uri imageUri;
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                imageUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileprovider", mOutputImage);
+            } else {
+                imageUri = Uri.fromFile(mOutputImage);
+            }
+            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
+            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //图片存储的地方.
+            intent.putExtra("return-data", false);
+            intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
+            intent.putExtra("noFaceDetection", true);
+            ComponentName componentName = intent.resolveActivity(getPackageManager());
+            if (componentName != null) {
+                startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYCAMERA);
+            }
         }
-        String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss")
-                .format(new Date());
-        // 照片命名
-        String cropFileName = "st_camera_" + timeStamp + ".jpg";
-        // 裁剪头像的绝对路径
-        protraitPath = getFileSavePath() + cropFileName;
-        protraitFile = new File(protraitPath);
-        cropUri = Uri.fromFile(protraitFile);
-        this.origUri = this.cropUri;
-        return this.cropUri;
-    }
-
-    /**
-     * 获取文件保存路径
-     *
-     * @return
-     */
-    private String getFileSavePath() {
-        return Environment
-                .getExternalStorageDirectory().getAbsolutePath()
-                + "/shitu/Portrait/";
     }
 
     /**
      * 拍照后裁剪
-     *
-     * @param data 原始图片
-     *             裁剪后图片
      */
-    private void startActionCrop(Uri data) {
+    private void startActionCrop(File file) {
+
+        String cropImageName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault()).format(new Date()) +
+                "-1-" + System.currentTimeMillis() + ".jpg";
+        File cropFile = new File(getExternalCacheDir(), cropImageName);
+        //注意到此处使用的file:// uri类型.
+        cropUri = Uri.fromFile(cropFile);
         Intent intent = new Intent("com.android.camera.action.CROP");
-        intent.setDataAndType(data, "image/*");
-        intent.putExtra("output", this.getUploadTempFile(data));
+        Uri sourceUri;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            sourceUri = getImageContentUri(this, file);
+        } else {
+            sourceUri = Uri.fromFile(file);
+        }
+        intent.setDataAndType(sourceUri, "image/*");
         intent.putExtra("crop", "true");
-        intent.putExtra("aspectX", 1);// 裁剪框比例
+        intent.putExtra("aspectX", 1);
         intent.putExtra("aspectY", 1);
-        intent.putExtra("outputX", CROP);// 输出图片大小
-        intent.putExtra("outputY", CROP);
-        intent.putExtra("scale", true);// 去黑边
-        intent.putExtra("scaleUpIfNeeded", true);// 去黑边
-        startActivityForResult(intent,
-                REQUEST_CODE_GETIMAGE_BYSDCARD);
+        intent.putExtra("outputX", 200);
+        intent.putExtra("outputY", 200);
+        intent.putExtra("return-data", false);
+        intent.putExtra(MediaStore.EXTRA_OUTPUT, cropUri);
+        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
+        intent.putExtra("noFaceDetection", true);
+        ComponentName componentName = intent.resolveActivity(getPackageManager());
+        if (componentName != null) {
+            startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYSDCARD);
+        }
     }
 
-    // 裁剪头像的绝对路径
-    private Uri getUploadTempFile(Uri uri) {
-        String storageState = Environment.getExternalStorageState();
-        if (storageState.equals(Environment.MEDIA_MOUNTED)) {
-            File savedir = new File(getFileSavePath());
-            if (!savedir.exists()) {
-                savedir.mkdirs();
-            }
+    //获取文件的Content uri路径
+    public static Uri getImageContentUri(Context context, File imageFile) {
+        String filePath = imageFile.getAbsolutePath();
+        Cursor cursor = context.getContentResolver().query(
+                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
+                new String[]{MediaStore.Images.Media._ID},
+                MediaStore.Images.Media.DATA + "=? ",
+                new String[]{filePath}, null);
+
+        if (cursor != null && cursor.moveToFirst()) {
+            int id = cursor.getInt(cursor
+                    .getColumnIndex(MediaStore.MediaColumns._ID));
+            Uri baseUri = Uri.parse("content://media/external/images/media");
+            return Uri.withAppendedPath(baseUri, "" + id);
         } else {
-            showToast("无法保存上传的头像,请检查SD卡是否挂载");
-            return null;
-        }
-        String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss")
-                .format(new Date());
-        String thePath = ImageUtils.getAbsolutePathFromNoStandardUri(uri);
-
-        // 如果是标准Uri
-        if (TextUtils.isEmpty(thePath)) {
-            thePath = ImageUtils.getAbsoluteImagePath(this, uri);
+            if (imageFile.exists()) {
+                ContentValues values = new ContentValues();
+                values.put(MediaStore.Images.Media.DATA, filePath);
+                return context.getContentResolver().insert(
+                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
+            } else {
+                return null;
+            }
         }
-        String ext = FileUtils.getFileFormat(thePath);
-        ext = TextUtils.isEmpty(ext) ? "jpg" : ext;
-        // 照片命名
-        String cropFileName = "st_crop_" + timeStamp + "." + ext;
-        // 裁剪头像的绝对路径
-        protraitPath = getFileSavePath() + cropFileName;
-        protraitFile = new File(protraitPath);
-
-        cropUri = Uri.fromFile(protraitFile);
-        return this.cropUri;
     }
 
     /**
@@ -302,9 +320,13 @@ public class OrgWriteCommentActivity extends TitleBarActivity implements View.On
         Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
         intent.addCategory(Intent.CATEGORY_OPENABLE);
         intent.setType("image/*");
-        startActivityForResult(Intent.createChooser(intent, "选择图片"), REQUEST_CODE_GETIMAGE_BYCROP);
+        ComponentName componentName = intent.resolveActivity(getPackageManager());
+        if (componentName != null) {
+            startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYCROP);
+        }
     }
 
+
     /**
      * 添加图片
      * @param file
@@ -323,14 +345,19 @@ public class OrgWriteCommentActivity extends TitleBarActivity implements View.On
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         switch (requestCode) {
             case REQUEST_CODE_GETIMAGE_BYCAMERA:
-                startActionCrop(origUri);// 拍照后裁剪
+                startActionCrop(mOutputImage);// 拍照后裁剪
             case REQUEST_CODE_GETIMAGE_BYCROP:
                 if (data != null) {
-                    startActionCrop(data.getData());// 选图后裁剪
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+                        startActionCrop(new File(FileUtils.parsePicturePath(OrgWriteCommentActivity.this, data.getData())));// 选图后裁剪
+                    }
                 }
                 break;
             case REQUEST_CODE_GETIMAGE_BYSDCARD:
-                addTakeImage(protraitFile);// 上传新照片
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+                    uploadFile = new File(FileUtils.parsePicturePath(OrgWriteCommentActivity.this, cropUri));
+                }
+                addTakeImage(uploadFile);
                 break;
         }
     }

+ 101 - 0
app/src/main/java/com/ynstkz/shitu/android/utils/FileUtils.java

@@ -1,10 +1,15 @@
 package com.ynstkz.shitu.android.utils;
 
+import android.content.ContentUris;
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Environment;
+import android.provider.DocumentsContract;
+import android.provider.MediaStore;
 import android.provider.OpenableColumns;
+import android.support.annotation.RequiresApi;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -298,4 +303,100 @@ public class FileUtils {
         int point = fileName.lastIndexOf( '.' );
         return fileName.substring( point+1 );
     }
+
+    // 解析获取图片库图片Uri物理路径
+    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+    public static String parsePicturePath(Context context, Uri uri) {
+
+        if (null == context || uri == null)
+            return null;
+
+        boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
+        // DocumentUri
+        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
+            // ExternalStorageDocumentsUri
+            if (isExternalStorageDocumentsUri(uri)) {
+                String docId = DocumentsContract.getDocumentId(uri);
+                String[] splits = docId.split(":");
+                String type = splits[0];
+                if ("primary".equalsIgnoreCase(type)) {
+                    return Environment.getExternalStorageDirectory() + File.separator + splits[1];
+                }
+            }
+            // DownloadsDocumentsUri
+            else if (isDownloadsDocumentsUri(uri)) {
+                String docId = DocumentsContract.getDocumentId(uri);
+                Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
+                return getDataColumn(context, contentUri, null, null);
+            }
+            // MediaDocumentsUri
+            else if (isMediaDocumentsUri(uri)) {
+                String docId = DocumentsContract.getDocumentId(uri);
+                String[] split = docId.split(":");
+                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;
+                }
+                String selection = "_id=?";
+                String[] selectionArgs = new String[]{split[1]};
+                return getDataColumn(context, contentUri, selection, selectionArgs);
+            }
+        }
+        // MediaStore (general)
+        else if ("content".equalsIgnoreCase(uri.getScheme())) {
+            if (isGooglePhotosContentUri(uri))
+                return uri.getLastPathSegment();
+            return getDataColumn(context, uri, null, null);
+        }
+        // File
+        else if ("file".equalsIgnoreCase(uri.getScheme())) {
+            return uri.getPath();
+        }
+        return null;
+
+    }
+
+    private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
+
+        Cursor cursor = null;
+        String column = "_data";
+        String[] projection = {column};
+        try {
+            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
+            if (cursor != null && cursor.moveToFirst()) {
+                int index = cursor.getColumnIndexOrThrow(column);
+                return cursor.getString(index);
+            }
+        } finally {
+            try {
+                if (cursor != null)
+                    cursor.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+
+    }
+
+    private static boolean isExternalStorageDocumentsUri(Uri uri) {
+        return "com.android.externalstorage.documents".equals(uri.getAuthority());
+    }
+
+    private static boolean isDownloadsDocumentsUri(Uri uri) {
+        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
+    }
+
+    private static boolean isMediaDocumentsUri(Uri uri) {
+        return "com.android.providers.media.documents".equals(uri.getAuthority());
+    }
+
+    private static boolean isGooglePhotosContentUri(Uri uri) {
+        return "com.google.android.apps.photos.content".equals(uri.getAuthority());
+    }
 }

+ 6 - 0
app/src/main/res/xml/file_paths.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <paths>
+        <external-path  name="images" path="" />
+    </paths>
+</resources>