【问题标题】:App is crashing when we upload the image from gallery?当我们从图库上传图像时,应用程序崩溃了?
【发布时间】:2016-08-16 06:49:36
【问题描述】:

我是 android 新手,所以如果您发现任何错误,请告诉我。现在说到我遇到的问题,我们单击图像视图,然后会出现一个弹出窗口并从您要上传图像的位置中选择,所以当我们点击图库时。

mProfileImageView.setOnClickListener(new View.OnClickListener() {
    @TargetApi(Build.VERSION_CODES.M)
    @Override
    public void onClick(View v) {
        new AlertDialog.Builder(ProfileActivity.this)
                .setTitle("Profile Picture")
                .setMessage("change your profile picture with")
                .setPositiveButton(R.string.capture_image, new   

            DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // continue with delete
                    captureImage();
                }
            })
            *//*.setNegativeButton(R.string.choose_image, new 

            DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // do nothing
                    chooseImage();
                }
            })*//*
                .setIcon(android.R.drawable.ic_dialog_alert)
                .show();
        }
    });

    public void chooseImage() {
    try {
        Intent i = new Intent(Intent.ACTION_PICK,      
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        i.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, IMAGE_QUALITY_LOW);
        i.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, 0);
        i.putExtra(MediaStore.EXTRA_SIZE_LIMIT, IMAGE_MAX_SIZE);
        i.setType("image/*");
        //i.setAction(Intent.ACTION_GET_CONTENT);

        /*i.putExtra("crop", "true");
        i.putExtra("aspectX", 0);
        i.putExtra("aspectY", 0);
        i.putExtra("outputX", 400);
        i.putExtra("outputY", 400);
        i.putExtra("return-data", true);*/

        startActivityForResult(Intent.createChooser(i, "Complete action using"), GALLERY_IMAGE_ACTIVITY_REQUEST_CODE);
    } catch (ActivityNotFoundException anfe) {
        //display an error message
        String errorMessage = "Oops - your device doesn't have gallery!";
        Toast.makeText(getApplicationContext(), errorMessage,
            Toast.LENGTH_LONG).show();
    }
}

当我们滚动 G 10-20 个图库图片并准备上传时,它崩溃了,我不知道为什么?

【问题讨论】:

  • 显示您的 onActivityResult 代码
  • 显示您的清单文件。你同意还是不同意?
  • 显示您的清单、onActivityResult 和错误 logcat。
  • 我已经把这个权限放在清单中了。.
  • 或其他我需要的权限。

标签: java android arrays


【解决方案1】:

试试这个: java代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private static final int SELECT_PICTURE = 100;
private static final String TAG = "MainActivity";

CoordinatorLayout coordinatorLayout;
FloatingActionButton btnSelectImage;
AppCompatImageView imgView;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    // Find the views...
    coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinatorLayout);
    btnSelectImage = (FloatingActionButton) findViewById(R.id.btnSelectImage);
    imgView = (AppCompatImageView) findViewById(R.id.imgView);

    btnSelectImage.setOnClickListener(this);

}

/* Choose an image from Gallery */
void openImageChooser() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            // Get the url from data
            Uri selectedImageUri = data.getData();
            if (null != selectedImageUri) {
                // Get the path from the Uri
                String path = getPathFromURI(selectedImageUri);
                Log.i(TAG, "Image Path : " + path);
                // Set the image in ImageView
                imgView.setImageURI(selectedImageUri);
            }
        }
    }
}

/* Get the real path from the URI */
public String getPathFromURI(Uri contentUri) {
    String res = null;
    String[] proj = {MediaStore.Images.Media.DATA};
    Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
    if (cursor.moveToFirst()) {
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        res = cursor.getString(column_index);
    }
    cursor.close();
    return res;
}

@Override
public void onClick(View v) {
    openImageChooser();
}

}

添加权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

布局:

<?xml version="1.0" encoding="utf-8"?>

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

<android.support.v7.widget.AppCompatImageView
    android:id="@+id/imgView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="@dimen/activity_horizontal_margin" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/btnSelectImage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/fab_margin"
    android:src="@android:drawable/ic_menu_gallery" />

 </android.support.design.widget.CoordinatorLayout>

【讨论】:

  • @user6615010 好的,检查一下
【解决方案2】:

您正在收到OutOfMemoryException,因为您正在谈论几张图片。以下是您的选择:

  • 通过将以下行添加到应用程序部分的 AndroidManifest.xml 中,从虚拟机请求 更大的堆android:largeHeap="true"
  • 尝试为您的图库使用尽可能小的图片。请记住:每个图像都未压缩地存储在您的应用程序堆中
  • 回收图片使用Bitmap.recycle()释放新内存。

【讨论】:

    【解决方案3】:

    试试这个java代码吧。我最近在我的 android 应用程序中使用了它

    弹出

    PopupWindow popup;
    
    private void initiatePopupWindow() {
        // TODO Auto-generated method stub
        try {
            LayoutInflater inflater = (LayoutInflater) getBaseContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View layout = inflater.inflate(R.layout.change_profileimg, null);
            popup = new PopupWindow(layout, android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                    android.view.ViewGroup.LayoutParams.MATCH_PARENT);
            Button imagefromgallery = (Button) layout
                    .findViewById(R.id.imagefromgallery);
            RelativeLayout relPopup = (RelativeLayout) layout.findViewById(R.id.relativeLayoutMainPopup);
            Button captureimage = (Button) layout
                    .findViewById(R.id.captureimage);
            imagefromgallery.setTypeface(Typeface.createFromAsset(getAssets(),
                "fonts/OpenSans-Regular.ttf"));
            captureimage.setTypeface(Typeface.createFromAsset(getAssets(),
                    "fonts/OpenSans-Regular.ttf"));
            imagefromgallery.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    galleryPick();
                    popup.dismiss();
                }
            });
    
            captureimage.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    // takePhoto();
                    callCameraApp();
                    popup.dismiss();
                }
            });
            relPopup.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
    
                    popup.dismiss();
    
                }
            });
            popup.setOutsideTouchable(true);
            popup.setTouchInterceptor(new OnTouchListener() {
    
                @Override
                public boolean onTouch(View arg0, MotionEvent event) {
                    // TODO Auto-generated method stub
                    if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                        popup.dismiss();
                        return true;
                    }
                    return false;
                }
            });
            popup.showAtLocation(layout, Gravity.BOTTOM, 0, 0);
    
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    
    }
    

    图库精选

    private void galleryPick() {
        try {
            Intent gintent = new Intent();
            gintent.setType("image/*");
            gintent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(
                    Intent.createChooser(gintent, "Select Picture"), PICK_IMAGE);
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), e.getMessage(),
                    Toast.LENGTH_LONG).show();
            Log.e(e.getClass().getName(), e.getMessage(), e);
        }
    }
    

    调用相机应用

    private void callCameraApp() {
        Intent i = new Intent();
        i.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
        String fileName = "new-photo-name.jpg";
        ContentValues values = new ContentValues();
        values.put(MediaColumns.TITLE, fileName);
        values.put(ImageColumns.DESCRIPTION, "Image captured by camera");
        // imageUri is the current activity attribute, define and save it for
        // later usage (also in onSaveInstanceState)
        imageUri = getContentResolver().insert(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        try {
            fileName = getPath(imageUri);
        } catch (Exception e) {
            // TODO: handle exception
        }
        i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(i, PICK_Camera_IMAGE1);
    }
    

    然后获取位图

    public Uri getOutputMediaFileUri(int type) {
            return Uri.fromFile(getOutputMediaFile(type));
        }
    
     private static File getOutputMediaFile(int type) {
    
            // External sdcard location
            File mediaStorageDir = new File(
                    Environment
                            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                    "XYZ_");
    
            // Create the storage directory if it does not exist
            if (!mediaStorageDir.exists()) {
                if (!mediaStorageDir.mkdirs()) {
                    Log.d("errorrr", "Oops! Failed create "
                            + "XYZ_" + " directory");
                    return null;
    
                }
            }
    
            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                    Locale.getDefault()).format(new Date());
            File mediaFile;
    
                mediaFile = new File(mediaStorageDir.getPath() + File.separator
                        + "IMG_" + timeStamp + ".png");
    
    
    
    
            return mediaFile;
    
     }
    
    String filePath;
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        Uri selectedImageUri = null;
        Uri selectedImagepicUri = null;
    
        filePath = null;
        switch (requestCode) {
    
        case PICK_Camera_IMAGE:
            if (resultCode == RESULT_OK) {
                // use imageUri here to access the image
                selectedImageUri = imageUri;
                /*
                 * Bitmap mPic = (Bitmap) data.getExtras().get("data");
                 * selectedImageUri =
                 * Uri.parse(MediaStore.Images.Media.insertImage
                 * (getContentResolver(), mPic,
                 * getResources().getString(R.string.app_name),
                 * Long.toString(System.currentTimeMillis())));
                 */
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "Picture was not taken",
                        Toast.LENGTH_SHORT).show();
            }
            break;
    
        case PICK_Camera_IMAGE1:
            if (resultCode == RESULT_OK) {
                // use imageUri here to access the image
                selectedImagepicUri = imageUri;
                /*
                 * Bitmap mPic = (Bitmap) data.getExtras().get("data");
                 * selectedImageUri =
                 * Uri.parse(MediaStore.Images.Media.insertImage
                 * (getContentResolver(), mPic,
                 * getResources().getString(R.string.app_name),
                 * Long.toString(System.currentTimeMillis())));
                 */
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "Picture was not taken",
                        Toast.LENGTH_SHORT).show();
            }
            break;
    
        case PICK_IMAGE:
            if (resultCode == Activity.RESULT_OK) {
                selectedImagepicUri = data.getData();
            }
    
        }
    
        if (selectedImagepicUri != null) {
            try {
                // OI FILE Manager
                String filemanagerstring = selectedImagepicUri.getPath();
    
                // MEDIA GALLERY
                String selectedImagePath = getPath(selectedImagepicUri);
    
                if (selectedImagePath != null) {
                    filePath = selectedImagePath;
                } else if (filemanagerstring != null) {
                    filePath = filemanagerstring;
                } else {
                    Toast.makeText(getApplicationContext(), "Unknown path",
                            Toast.LENGTH_LONG).show();
                    Log.e("Bitmap", "Unknown path");
                }
    
                if (filePath != null) {
                    decodeFile1(filePath);
                } else {
                    bitmap = null;
                }
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(), "Internal error",
                        Toast.LENGTH_LONG).show();
                Log.e(e.getClass().getName(), e.getMessage(), e);
            }
        }
    
        if (selectedImageUri != null) {
            try {
                // OI FILE Manager
                String filemanagerstring = selectedImageUri.getPath();
    
                // MEDIA GALLERY
                String selectedImagePath = getPath(selectedImageUri);
    
                if (selectedImagePath != null) {
                    filePath = selectedImagePath;
                } else if (filemanagerstring != null) {
                    filePath = filemanagerstring;
                } else {
                    Toast.makeText(getApplicationContext(), "Unknown path",
                            Toast.LENGTH_LONG).show();
                    Log.e("Bitmap", "Unknown path");
                }
    
                if (filePath != null) {
                    decodeFile(filePath);
                } else {
                    bitmap = null;
                }
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(), "Internal error",
                        Toast.LENGTH_LONG).show();
                Log.e(e.getClass().getName(), e.getMessage(), e);
            }
        }
    
    }
    
    public String getPath(Uri uri) {
        String[] projection = { MediaColumns.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        if (cursor != null) {
            // HERE YOU WILL GET A NULLPOINTER IF CURSOR IS NULL
            // THIS CAN BE, IF YOU USED OI FILE MANAGER FOR PICKING THE MEDIA
            int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } else
            return null;
    }
    
    public void decodeFile(String filePath) {
        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(filePath, o);
    
        // The new size we want to scale to
        final int REQUIRED_SIZE = 512;
    
        // Find the correct scale value. It should be the power of 2.
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE)
                break;
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }
    
        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        bitmap = BitmapFactory.decodeFile(filePath, o2);
        /**Bitmap.createScaledBitmap(bitmap, 200, 200, false);*/
        if (bitmap == null) {
            Toast.makeText(getApplicationContext(), "Please select image",
                    Toast.LENGTH_SHORT).show();
        } else {
            ivr.setImageBitmap(bitmap);
            ivrIn.setImageBitmap(bitmap);
            // new ImageGalleryTask().execute();
        }
    }
    
    public void decodeFile1(String filePath) {
        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(filePath, o);
    
        // The new size we want to scale to
        final int REQUIRED_SIZE = 512;
    
        // Find the correct scale value. It should be the power of 2.
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE)
                break;
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }
    
        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        bitmap = BitmapFactory.decodeFile(filePath, o2);
        /**Bitmap.createScaledBitmap(bitmap, 200, 200, false);*/
        if (bitmap == null) {
            Toast.makeText(getApplicationContext(), "Please select image",
                    Toast.LENGTH_SHORT).show();
        } else {
            ivr.setImageBitmap(bitmap);
            ivrIn.setImageBitmap(bitmap);
            // new ImageGalleryTask().execute();
        }
    
    }
    

    上传图片的异步任务

     private class UploadFileToServer extends AsyncTask<Void, Integer, String> {
            @Override
            protected void onPreExecute() {
                // setting progress bar to zero         
                progressDialog = new ProgressDialog(Profile.this);
                //progressDialog.setTitle("Fetching data");
                progressDialog.setMessage("Uploading profile pic, Please Wait....");
                progressDialog.show();
                progressDialog.setCancelable(false);
                super.onPreExecute();
            }
    
            @Override
            protected void onProgressUpdate(Integer... progress) {
                // Making progress bar visible
                System.out.println("progress update "+progress[0]);
               // progressBar.setVisibility(View.VISIBLE); 
                // updating progress bar value
               // progressBar.setProgress(progress[0]); 
                // updating percentage value
               // txtPercentage.setText(String.valueOf(progress[0]) + "%");
            }
    
            @Override
            protected String doInBackground(Void... params) {
                return uploadFile();
            }
    
            @SuppressWarnings("deprecation")
            private String uploadFile() {
                String responseString = null;
                int count;
                try
                {       
                    FileInputStream fileInputStream = new FileInputStream(new File(filePath));                  
                    URL url = new URL("url"); 
                    System.out.println("url "+url);
    
                    connection = (HttpURLConnection) url.openConnection();   
    
                    // Allow Inputs &amp; Outputs.
                    connection.setDoInput(true);
                    connection.setDoOutput(true);
                    connection.setUseCaches(false);
    
                    // Set HTTP method to POST.
                    connection.setRequestMethod("POST");
    
                    connection.setRequestProperty("Connection", "Keep-Alive");
                    connection.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
    
                    outputStream = new DataOutputStream( connection.getOutputStream() );
                    outputStream.writeBytes(twoHyphens + boundary + lineEnd);
                    outputStream.writeBytes("Content-Disposition: form-data; name=\"image\";filename=\"" + filePath + "\"" + lineEnd);
                    Log.e("chhuuuh", filePath + System.currentTimeMillis());
                    outputStream.writeBytes(lineEnd);
    
                    bytesAvailable = fileInputStream.available();
                    bufferSize = Math.min(bytesAvailable, maxBufferSize);
                    buffer = new byte[bufferSize];
    
                    bytesRead = fileInputStream.read(buffer, 0, bufferSize);
    
                    while (bytesRead > 0)
                    {
                        outputStream.write(buffer, 0, bufferSize);
                        bytesAvailable = fileInputStream.available();
                        bufferSize = Math.min(bytesAvailable, maxBufferSize);
                        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
                    }       
                    outputStream.writeBytes(lineEnd);
                    outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
    
    
                    responseString = connection.getResponseMessage();
    
                    fileInputStream.close();
                    outputStream.flush();                
                    outputStream.close();
                    InputStream is = null;
                    try {
                      is = connection.getInputStream();
                      int ch;
                      StringBuffer sb = new StringBuffer();
                      while ((ch = is.read()) != -1) {
                        sb.append((char) ch);
                      }
                      return sb.toString();
                    } catch (IOException e) {
                      throw e;
                    } finally {
                      if (is != null) {
                        is.close();
                      }
                    }
                }
                catch (Exception ex)
                {
    
                }
                return responseString;
    
            }
    
            @Override
            protected void onPostExecute(String result) {
    
                String result1 = result;
              Log.e("respons form server", "response from server: " + result); 
              if(progressDialog.isShowing())
              {
                  progressDialog.dismiss();
              }
              try {
                    JSONObject json = new JSONObject(result);
                    int response = json.getInt("status_code");
    
                    if(response == 1)
                    {
                        if (result1.contains("null")) {
                            Toast.makeText(getApplicationContext(), "You didn't change the image,  please choose an image from gallery or click from the camera.", 2000).show();
                        } else {
                        JSONObject arr = json.getJSONObject("details");
                        String erer = arr.getString("error");
                        String message = arr.getString("message");
                        Toast.makeText(getApplicationContext(), message, 1000).show();
                        }
                    }
                    else
                    {
                        showAlert("Error Uploading Image, Please try again!!!");    
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
                super.onPostExecute(result);
            }
    
        }
    

    获取正确路径

    public static String getPath(final Context context, final Uri uri) {
    
            final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
    
            // DocumentProvider
            if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
                // ExternalStorageProvider
                if (isExternalStorageDocument(uri)) {
                    final String docId = DocumentsContract.getDocumentId(uri);
                    final String[] split = docId.split(":");
                    final String type = split[0];
    
                    if ("primary".equalsIgnoreCase(type)) {
                        return Environment.getExternalStorageDirectory() + "/" + split[1];
                    }
    
                    // TODO handle non-primary volumes
                }
                // DownloadsProvider
                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(context, contentUri, null, null);
                }
                // MediaProvider
                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(context, contentUri, selection, selectionArgs);
                }
            }
            // MediaStore (and general)
            else if ("content".equalsIgnoreCase(uri.getScheme())) {
    
                // Return the remote address
                if (isGooglePhotosUri(uri))
                    return uri.getLastPathSegment();
    
                return getDataColumn(context, uri, null, null);
            }
            // File
            else if ("file".equalsIgnoreCase(uri.getScheme())) {
                return uri.getPath();
            }
    
            return null;
        }
    
        /**
         * Get the value of the data column for this Uri. This is useful for
         * MediaStore Uris, and other file-based ContentProviders.
         *
         * @param context The context.
         * @param uri The Uri to query.
         * @param selection (Optional) Filter used in the query.
         * @param selectionArgs (Optional) Selection arguments used in the query.
         * @return The value of the _data column, which is typically a file path.
         */
        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;
        }
    
    
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is ExternalStorageProvider.
         */
        public static boolean isExternalStorageDocument(Uri uri) {
            return "com.android.externalstorage.documents".equals(uri.getAuthority());
        }
    
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is DownloadsProvider.
         */
        public static boolean isDownloadsDocument(Uri uri) {
            return "com.android.providers.downloads.documents".equals(uri.getAuthority());
        }
    
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is MediaProvider.
         */
        public static boolean isMediaDocument(Uri uri) {
            return "com.android.providers.media.documents".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());
        }
    

    6.0 及以上版本的权限

         @Override
            public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
                Log.d("", "Permission callback called-------");
                switch (requestCode) {
                    case REQUEST_ID_MULTIPLE_PERMISSIONS: {
    
                        Map<String, Integer> perms = new HashMap<String, Integer>();
                        // Initialize the map with both permissions
                        perms.put(Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED);
                        perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
                        perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
                        perms.put(Manifest.permission.CALL_PHONE, PackageManager.PERMISSION_GRANTED);
                        // Fill with actual results from user
                        if (grantResults.length > 0) {
                            for (int i = 0; i < permissions.length; i++)
                                perms.put(permissions[i], grantResults[i]);
                            // Check for both permissions
                            if (perms.get(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
                                    && perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
                                    && perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                                    && perms.get(Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
                                Log.d("", " permission granted");
                                // process the normal flow
                                //else any one or both the permissions are not granted
                            } else {
                                    Log.d("", "Some permissions are not granted ask again ");
                                    //permission is denied (this is the first time, when "never ask again" is not checked) so ask again explaining the usage of permission
                                    // shouldShowRequestPermissionRationale will return true
                                    //show the dialog or snackbar saying its necessary and try again otherwise proceed with setup.
                                    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) 
                                            || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                                            || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)
                                            || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)) {
                                        showDialogOK("This app have camera functionality so Camera and Write External Storage Permission required for this app",
                                                new DialogInterface.OnClickListener() {
                                                    @Override
                                                    public void onClick(DialogInterface dialog, int which) {
                                                        switch (which) {
                                                            case DialogInterface.BUTTON_POSITIVE:
                                                                checkAndRequestPermissions();
                                                                break;
                                                            case DialogInterface.BUTTON_NEGATIVE:
                                                                // proceed with logic by disabling the related features or quit the app.
                                                                 Toast.makeText(getApplicationContext(), "Please go to settings and enable permissions.", 2000).show();
                                                                break;
                                                        }
                                                    }
                                                });
                                    }
                                    //permission is denied (and never ask again is  checked)
                                    //shouldShowRequestPermissionRationale will return false
                                    else {
                                        Toast.makeText(this, "Go to settings and enable permissions", Toast.LENGTH_LONG)
                                                .show();
            //                            //proceed with logic by disabling the related features or quit the app.
                                    }
                            }
                        }
                    }
                }
    
            }
    
            private void showDialogOK(String message, DialogInterface.OnClickListener okListener) {
                new AlertDialog.Builder(this)
                        .setMessage(message)
                        .setPositiveButton("OK", okListener)
                        .setNegativeButton("Cancel", okListener)
                        .create()
                        .show();
            }
    
            private  boolean checkAndRequestPermissions() {
                int permissionCamera = ContextCompat.checkSelfPermission(this,  Manifest.permission.CAMERA);
                int locationPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
                int permissionWriteExternal = ContextCompat.checkSelfPermission(this,  Manifest.permission.WRITE_EXTERNAL_STORAGE);
                int permissionCallPhone = ContextCompat.checkSelfPermission(this,  Manifest.permission.CALL_PHONE);
    
                List<String> listPermissionsNeeded = new ArrayList<String>();
                if (permissionCamera != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.CAMERA);
                }
                if (locationPermission != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
                }
                if (permissionWriteExternal != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }
                if (permissionCallPhone != PackageManager.PERMISSION_GRANTED) {
                    listPermissionsNeeded.add(Manifest.permission.CALL_PHONE);
                }
                if (!listPermissionsNeeded.isEmpty()) {
                    ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS);
                    return false;
                }
                return true;
            }
    

    我知道这段代码太长而无法阅读,但这正是你想要的

    【讨论】:

    • 非常感谢。
    • @user6615010 如果它适合您,请为其他人接受这个答案。
    猜你喜欢
    • 2021-12-25
    • 2020-06-01
    • 2015-08-10
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多