简体   繁体   English

当我们从图库上传图像时应用程序崩溃?

[英]App is crashing when we upload the image from gallery?

I am new in android so, if you found any mistake please tell me.Now come to the point what i got the problem we click on image view then one popup will come and choose from where you want to upload the image so when we click on gallery then.我是 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();
    }
}

When we are scrollingG 10-20 gallery images and going for upload at that time it's crashing i don't know why?当我们滚动 10-20 张图库图片并准备上传时,它崩溃了,我不知道为什么?

try this: java code:试试这个: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();
}

}

Add Permission添加权限

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

layout:布局:

<?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>

Try this java code it works.试试这个java代码它的工作原理。 I used it recently in my android app我最近在我的 android 应用程序中使用了它

Pop up弹出

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();
    }

}

Gallery pick画廊精选

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);
    }
}

Call camera app调用相机应用

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);
}

then to get the bitmap然后获取位图

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();
    }

}

Async task to upload image上传图片的异步任务

 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);
        }

    }

get the correct path得到正确的路径

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());
    }

Permissions for 6.0 and above versions 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;
        }

I know this code is too long to read but this is exactly what you want我知道这段代码太长而无法阅读,但这正是您想要的

You are receiving an OutOfMemoryException since you are talking about several images.由于您正在谈论多个图像,因此您收到了OutOfMemoryException Here are your options:以下是您的选择:

  • Request a larger heap from the virtual machine by adding the following line into your AndroidManifest.xml in the application section: android:largeHeap="true"通过将以下行添加到 AndroidManifest.xml 的应用程序部分,从虚拟机请求更大的堆android:largeHeap="true"
  • Try to use images as small as possible for your gallery.尝试为您的画廊使用尽可能小的图像。 Remeber: each image is stored uncompressed into your applications heap记住:每个图像都未压缩地存储在您的应用程序堆中
  • Recycle images that are not visible at the moment using Bitmap.recycle() to free new memory.使用Bitmap.recycle()回收目前不可见的图像以释放新内存。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM