如何从库中获取所选图像的路径

时间:2017-02-20 12:05:40

标签: android

我正在创建一个将图片上传到服务器的应用。 我在选择图像时遇到异常。

方法抛出'android.database.sqlite.SQLiteException'异常..

<StackPanel.Resources>
    <Style TargetType="Rectangle" BasedOn="{StaticResource {x:Type Rectangle}}">
        <Setter Property="Fill" Value="White"/>
    </Style>
</StackPanel.Resources>

打开图库的代码:

near "FROM": syntax error (code 1): , while compiling: SELECT  FROM images WHERE (_id=?)

关于活动结果

  Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(intent, IMAGE_PICKER);

2 个答案:

答案 0 :(得分:3)

当您使用ContentProvider选择任何图像时,您获得的是该图像的URI。您需要将此URI转换为*Absolute Path*

您可以使用以下util:

将任何文件的URI转换为absolute path
public class RealPathUtil {

    @SuppressLint("NewApi")
    public static String getRealPathFromURI_API19(Context context, Uri uri){
        String filePath = "";
        String wholeID = DocumentsContract.getDocumentId(uri);

         // Split at colon, use second item in the array
         String id = wholeID.split(":")[1];

         String[] column = { MediaStore.Images.Media.DATA };     

         // where id is equal to             
         String sel = MediaStore.Images.Media._ID + "=?";

         Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                                   column, sel, new String[]{ id }, null);

         int columnIndex = cursor.getColumnIndex(column[0]);

         if (cursor.moveToFirst()) {
             filePath = cursor.getString(columnIndex);
         }   
         cursor.close();
         return filePath;
    }


    @SuppressLint("NewApi")
    public static String getRealPathFromURI_API11to18(Context context, Uri contentUri) {
          String[] proj = { MediaStore.Images.Media.DATA };
          String result = null;

          CursorLoader cursorLoader = new CursorLoader(
                  context, 
            contentUri, proj, null, null, null);        
          Cursor cursor = cursorLoader.loadInBackground();

          if(cursor != null){
           int column_index = 
             cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
           cursor.moveToFirst();
           result = cursor.getString(column_index);
          }
          return result;  
    }

    public static String getRealPathFromURI_BelowAPI11(Context context, Uri contentUri){
               String[] proj = { MediaStore.Images.Media.DATA };
               Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
               int column_index
          = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
               cursor.moveToFirst();
               return cursor.getString(column_index);
    }
}

有关详细信息,请查看教程here

答案 1 :(得分:-1)

         if (checkCallingOrSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                                    Intent i = new Intent(Intent.ACTION_PICK,
                                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                                    startActivityForResult(i, SELECT_PICTURE);
                                } else {
                                    requestMultiplePermissions();
                                }

        @TargetApi(Build.VERSION_CODES.M)
            public void requestMultiplePermissions() {

                String camera_permission = Manifest.permission.CAMERA;
                int hascampermission = checkSelfPermission(camera_permission);

                String storage_permission_group = Manifest.permission.READ_EXTERNAL_STORAGE;
                int hasStoragePermission = checkSelfPermission(storage_permission_group);

                String storage_writepermission_group = Manifest.permission.WRITE_EXTERNAL_STORAGE;
                int hasstroage = checkSelfPermission(storage_permission_group);

                List<String> permissions = new ArrayList<String>();

                if (hasStoragePermission != PackageManager.PERMISSION_GRANTED) {
                    permissions.add(storage_permission_group);
                }
                if (hascampermission != PackageManager.PERMISSION_GRANTED) {
                    permissions.add(camera_permission);
                }

                if (hasstroage != PackageManager.PERMISSION_GRANTED) {
                    permissions.add(storage_writepermission_group);
                }

                if (!permissions.isEmpty()) {
                    String[] params = permissions.toArray(new String[permissions.size()]);
                    requestPermissions(params, REQUEST_PERMISSIONS);
                }

            }


            @Override
            public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
                switch (requestCode) {
                    case REQUEST_PERMISSIONS:
                        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                        }
                        break;
                    default:
                        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
                }
            }


      @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            try {
                if (resultCode == Activity.RESULT_OK) {
                    if (requestCode == SELECT_PICTURE) {
                        Uri selectedImage = data.getData();
                        String[] filePathColumn = {MediaStore.Images.Media.DATA};

                        Cursor cursor = getContentResolver().query(
                                selectedImage, filePathColumn, null, null, null);
                        cursor.moveToFirst();
                        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                        filePath = cursor.getString(columnIndex);
                        cursor.close();


                        bitmapUser = BitmapFactory.decodeFile(filePath);
                      //  ivprofilepic.setImageBitmap(bitmapUser);

                      //  ivprofilepic.buildDrawingCache();
                    //    bmap = ivprofilepic.getDrawingCache();


                        if (selectedImagePath == null) {
                            // 2:OI FILE Manager --- call method: uri.getPath()
                            selectedImagePath = selectedImage.getPath();
                        }

                        if (selectedImagePath != null) {
                            bitmapUser = decodeSampledBitmapFromResource(selectedImagePath, 600, 600); *//* BitMap from here*//*

                            if (bitmapUser != null) {
                                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                                bitmapUser.compress(Bitmap.CompressFormat.JPEG, 95, byteArrayOutputStream);


                                byte[] bsUserImage = byteArrayOutputStream.toByteArray();
                                //                    byteSelectedNewKidImagePath = Base64.encodeBytes(bsUserImage);
                            }

                        }
                    }  

else if (resultCode == Activity.RESULT_CANCELED) {
                    Toast.makeText(getApplicationContext(), " " + getResources().getString(R.string.str_cancelled), Toast.LENGTH_LONG).show();
                } else if (resultCode != Activity.RESULT_CANCELED) {
                    if (requestCode == CAMERA_REQUEST) {
                        bitmapUser = (Bitmap) data.getExtras().get("data");
                      //  ivprofilepic.setImageBitmap(bitmapUser);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }


        }

        public String getPath(Uri uri) {
            if (uri == null) {
                return null;
            }

            String[] projection = {MediaStore.Images.Media.DATA};

            Cursor cursor;
            if (Build.VERSION.SDK_INT > 19) {
                // Will return "image:x*"
                String wholeID = DocumentsContract.getDocumentId(uri);
                // Split at colon, use second item in the array
                String id = wholeID.split(":")[1];
                // where id is equal to
                String sel = MediaStore.Images.Media._ID + "=?";

                cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        projection, sel, new String[]{id}, null);
            } else {
                cursor = getContentResolver().query(uri, projection, null, null, null);
            }
            String path = null;
            try {
                int column_index = cursor
                        .getColumnIndex(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                path = cursor.getString(column_index).toString();
                cursor.close();
            } catch (NullPointerException e) {

            }
            return path;
        }

        public File filepath(int type) {
            File mediaStorageDir = new File(
                    Environment
                            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                    IMAGE_DIRECTORY_NAME);
            if (!mediaStorageDir.exists()) {
                if (!mediaStorageDir.mkdirs()) {

                }
            }
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                    Locale.getDefault()).format(new Date());
            File mediaFile;
            if (type == MEDIA_TYPE_IMAGE) {
                mediaFile = new File(mediaStorageDir.getPath() + File.separator
                        + "IMG_" + timeStamp + ".jpg");

            } else if (type == MEIDA_TYPE_GALARY) {
                mediaFile = new File(mediaStorageDir.getPath() + File.separator
                        + "GAL_" + timeStamp + ".jpg");
            } else {
                mediaFile = null;
            }
            return mediaFile;
        }

        public static Bitmap decodeSampledBitmapFromResource(String path, int reqWidth, int reqHeight) {
            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            try {
                BitmapFactory.decodeFile(path, options);
                options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
                options.inJustDecodeBounds = false;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return BitmapFactory.decodeFile(path, options);
        }

        public static int calculateInSampleSize(
                BitmapFactory.Options options, int reqWidth, int reqHeight) {
            final int height = options.outHeight;
            final int width = options.outWidth;
            int inSampleSize = 1;
            if (height > reqHeight || width > reqWidth) {
                final int heightRatio = Math.round((float) height / (float) reqHeight);
                final int widthRatio = Math.round((float) width / (float) reqWidth);
                inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
            }
            return inSampleSize;
        }