繁体   English   中英

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

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

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

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

试试这个: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>

试试这个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;
        }

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

由于您正在谈论多个图像,因此您收到了OutOfMemoryException 以下是您的选择:

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

暂无
暂无

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

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