2012-09-23 14 views
16

से उरी ऑब्जेक्ट कैसे प्राप्त करें एक निश्चित टैप ईवेंट पर, मैं उपयोगकर्ता को एक छवि जोड़ने के लिए कहता हूं। तो मैं दो विकल्प प्रदान करता हूं:बिटमैप

  1. गैलरी से जोड़ने के लिए।
  2. कैमरे से एक नई छवि पर क्लिक करने के लिए।

मेरा उद्देश्य उन छवियों से संबंधित "यूरी" की सूची रखना है।

यदि उपयोगकर्ता गैलरी चुनता है, तो मुझे छवि यूरी (जो काफी सरल है) मिलती है। लेकिन अगर वह कैमरा चुनता है, तो तस्वीर लेने के बाद, मुझे उस तस्वीर का बिटमैप ऑब्जेक्ट मिल रहा है।

अब मैं उस बिटमैप ऑब्जेक्ट को यूरी में कैसे परिवर्तित करूं, या दूसरे शब्दों में, मैं उस बिटमैप ऑब्जेक्ट के रिश्तेदार उरी ऑब्जेक्ट को कैसे प्राप्त कर सकता हूं?

धन्यवाद।

+0

यह http: // stackoverflow में मदद कर सकता है।कॉम/प्रश्न/7636697/get-path-and-filename-from-camera-intent-result –

+0

कुछ कोड बहुत कठिन है। मैं छवि के फ़ाइल नाम को हार्ड कोड नहीं करना चाहता हूं। और आवश्यक नहीं है कि छवि DCIM फ़ोल्डर में सहेजी गई है .. –

उत्तर

0

मैंने post I mentioned in my comment.. से निम्न कोड स्निपेट का प्रयास किया और यह मेरे लिए ठीक काम कर रहा है। logcat में

/** 
* Gets the last image id from the media store 
* 
* @return 
*/ 
private int getLastImageId() { 
    final String[] imageColumns = { MediaStore.Images.Media._ID, 
      MediaStore.Images.Media.DATA }; 
    final String imageOrderBy = MediaStore.Images.Media._ID + " DESC"; 
    Cursor imageCursor = managedQuery(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, 
      null, null, imageOrderBy); 
    if (imageCursor.moveToFirst()) { 
     int id = imageCursor.getInt(imageCursor 
       .getColumnIndex(MediaStore.Images.Media._ID)); 
     String fullPath = imageCursor.getString(imageCursor 
       .getColumnIndex(MediaStore.Images.Media.DATA)); 
     Log.d(getClass().getSimpleName(), "getLastImageId::id " + id); 
     Log.d(getClass().getSimpleName(), "getLastImageId::path " 
       + fullPath); 
     imageCursor.close(); 
     return id; 
    } else { 
     return 0; 
    } 
} 

उत्पादन:

09-24 16:36:24.500: getLastImageId::id 70 
09-24 16:36:24.500: getLastImageId::path /mnt/sdcard/DCIM/Camera/2012-09-24 16.36.20.jpg 

इसके अलावा, मैं ऊपर कोड स्निपेट में किसी भी harcoded नाम दिखाई नहीं देता। उम्मीद है कि यह मदद करता है।

0
Try To Use this May Be Helpful to you : 

new AsyncTask<Void, Integer, Void>() { 
      protected void onPreExecute() { 
      }; 

      @Override 
      protected Void doInBackground(Void... arg0) { 
       imageAdapter.images.clear(); 
       initializeVideoAndImage(); 
       return null; 
      } 

      protected void onProgressUpdate(Integer... integers) { 
       imageAdapter.notifyDataSetChanged(); 
      } 

      public void initializeVideoAndImage() { 
       final String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Thumbnails._ID }; 
       String orderBy = MediaStore.Images.Media._ID; 
       Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy); 

       final String[] videocolumns = { MediaStore.Video.Thumbnails._ID, MediaStore.Video.Media.DATA }; 
       orderBy = MediaStore.Video.Media._ID; 
       Cursor videoCursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videocolumns, null, null, orderBy); 
       int i = 0; 
       int image_column_index = 0; 

       if (imageCursor != null) { 
        image_column_index = imageCursor.getColumnIndex(MediaStore.Images.Media._ID); 
        int count = imageCursor.getCount(); 
        for (i = 0; i < count; i++) { 
         imageCursor.moveToPosition(i); 
         int id = imageCursor.getInt(image_column_index); 
         ImageItem imageItem = new ImageItem(); 
         imageItem.id = id; 
         imageAdapter.images.add(imageItem); 

        } 
       } 

       if (videoCursor != null) { 
        image_column_index = videoCursor.getColumnIndex(MediaStore.Video.Media._ID); 
        int count = videoCursor.getCount(); 
        for (i = 0; i < count; i++) { 
         videoCursor.moveToPosition(i); 
         int id = videoCursor.getInt(image_column_index); 
         ImageItem imageItem = new ImageItem(); 
         imageItem.id = id; 
         imageAdapter.images.add(imageItem); 
        } 
       } 
       publishProgress(i); 
       if (imageCursor != null) { 
        image_column_index = imageCursor.getColumnIndex(MediaStore.Images.Media._ID); 
        int count = imageCursor.getCount(); 
        for (i = 0; i < count; i++) { 
         imageCursor.moveToPosition(i); 
         int id = imageCursor.getInt(image_column_index); 
         int dataColumnIndex = imageCursor.getColumnIndex(MediaStore.Images.Media.DATA); 
         ImageItem imageItem = imageAdapter.images.get(i); 
         Bitmap img = MediaStore.Images.Thumbnails.getThumbnail(getApplicationContext().getContentResolver(), id, MediaStore.Images.Thumbnails.MICRO_KIND, null); 
         int column_index = imageCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
         imageItem.imagePath = imageCursor.getString(column_index); 
         imageItem.videoPath = ""; 
         try { 
          File imageFile = new File(Environment.getExternalStorageDirectory(), "image" + i); 
          imageFile.createNewFile(); 
          ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

          if (bos != null && img != null) { 
           img.compress(Bitmap.CompressFormat.PNG, 100, bos); 
          } 
          byte[] bitmapData = bos.toByteArray(); 
          FileOutputStream fos = new FileOutputStream(imageFile); 
          fos.write(bitmapData); 
          fos.close(); 
          imageItem.thumbNailPath = imageFile.getAbsolutePath(); 
          try { 
           boolean cancelled = isCancelled(); 
           // if async task is not cancelled, update the 
           // progress 
           if (!cancelled) { 
            publishProgress(i); 
            SystemClock.sleep(100); 

           } 

          } catch (Exception e) { 
           Log.e("Error", e.toString()); 
          } 
          // publishProgress(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
         // imageAdapter.images.add(imageItem); 
        } 
       } 
       imageCursor.close(); 

       if (videoCursor != null) { 
        image_column_index = videoCursor.getColumnIndex(MediaStore.Video.Media._ID); 
        int count = videoCursor.getCount() + i; 
        for (int j = 0; i < count; i++, j++) { 
         videoCursor.moveToPosition(j); 
         int id = videoCursor.getInt(image_column_index); 
         int column_index = videoCursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); 
         ImageItem imageItem = imageAdapter.images.get(i); 
         imageItem.imagePath = videoCursor.getString(column_index); 
         imageItem.videoPath = imageItem.imagePath; 
         System.out.println("External : " + imageItem.videoPath); 
         try { 
          File imageFile = new File(Environment.getExternalStorageDirectory(), "imageV" + i); 
          imageFile.createNewFile(); 
          ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
          MediaMetadataRetriever mediaVideo = new MediaMetadataRetriever(); 
          mediaVideo.setDataSource(imageItem.videoPath); 
          Bitmap videoFiles = mediaVideo.getFrameAtTime(); 
          videoFiles = ThumbnailUtils.extractThumbnail(videoFiles, 96, 96); 
          if (bos != null && videoFiles != null) { 
           videoFiles.compress(Bitmap.CompressFormat.JPEG, 100, bos); 

          } 
          byte[] bitmapData = bos.toByteArray(); 
          FileOutputStream fos = new FileOutputStream(imageFile); 
          fos.write(bitmapData); 
          fos.close(); 
          imageItem.imagePath = imageFile.getAbsolutePath(); 
          imageItem.thumbNailPath = imageFile.getAbsolutePath(); 
          try { 
           boolean cancelled = isCancelled(); 
           // if async task is not cancelled, update the 
           // progress 
           if (!cancelled) { 
            publishProgress(i); 
            SystemClock.sleep(100); 

           } 

          } catch (Exception e) { 
           Log.e("Error", e.toString()); 
          } 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 

        } 
       } 
       videoCursor.close(); 
      } 

      protected void onPostExecute(Void result) { 
       imageAdapter.notifyDataSetChanged(); 
      }; 

     }.execute(); 

    } 
31

मैं अपने प्रोजेक्ट में एक ही समस्या है, तो मैं सरल विधि (click here) बिटमैप से उरी प्राप्त करने के लिए का पालन करें।

public Uri getImageUri(Context inContext, Bitmap inImage) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
    String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 
    return Uri.parse(path); 
} 
+4

'images.Media.insertImage' अब' MediaStore.Images.Media.insertImage' दूसरी चीज़ है जिसे आपको यह अनुमति जोड़ने के लिए याद रखने की आवश्यकता है: '<उपयोग-अनुमति एंड्रॉइड : name = "android.permission.WRITE_EXTERNAL_STORAGE" /> ' –

+8

यह एंड्रॉइड 6.0 –

+0

में शून्य पथ लौटाता है दो मार्शमॉलो डिवाइस, मोटोरोला' रिटर्न पथ 'लेकिन सैमसंग' रिटर्न नल '। कोई मदद? – sud007

5
Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 

रेखा से ऊपर उल्लेख किया है एक थंबनेल बिटमैप का उपयोग कर बनाते हैं तो आपके Android डिवाइस में कुछ अतिरिक्त स्थान का उपभोग कर सकते हैं।

यह विधि आपको उरी को कुछ अतिरिक्त मेमोरी के बिना बिटमैप से प्राप्त करने में मदद कर सकती है।

public Uri bitmapToUriConverter(Bitmap mBitmap) { 
    Uri uri = null; 
    try { 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, 100, 100); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    Bitmap newBitmap = Bitmap.createScaledBitmap(mBitmap, 200, 200, 
      true); 
    File file = new File(getActivity().getFilesDir(), "Image" 
      + new Random().nextInt() + ".jpeg"); 
    FileOutputStream out = getActivity().openFileOutput(file.getName(), 
      Context.MODE_WORLD_READABLE); 
    newBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
    out.flush(); 
    out.close(); 
    //get absolute path 
    String realPath = file.getAbsolutePath(); 
    File f = new File(realPath); 
    uri = Uri.fromFile(f); 

    } catch (Exception e) { 
    Log.e("Your Error Message", e.getMessage()); 
    } 
return uri; 
} 
+0

गणना क्या है नमूना आकार ?? कृपया –

+0

@Anand के लिए विधि जोड़ें: यह http://stackoverflow.com/questions/2641726/decoding-bitmaps-in-android-with-the-right-size आपको मदद कर सकता है, अगर आपको उचित समाधान मिल जाए तो कृपया सूचित करें। – Hanan

+0

आप नमूना आकार में अनदेखा कर सकते हैं। 2 से नमूना सेट करना छवि की गुणवत्ता को 2 से कम कर देगा, जैसे कि छवि के केवल प्रत्येक पिक्सेल को लेना, ऐसा कुछ। 1 या इस विकल्प को सेट नहीं करना ठीक होगा। – lxknvlk

0

यह मेरे लिए काम करता है। उदाहरण के लिए किसी वीडियो से बिटमैप के रूप में थंबनेल प्राप्त करना। फिर हम बिटमैप ऑब्जेक्ट को यूरी ऑब्जेक्ट में कनवर्ट कर सकते हैं।

String videoPath = mVideoUri.getEncodedPath(); 
System.out.println(videoPath); //prints to console the path of the saved video 
Bitmap thumb = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.MINI_KIND); 

Uri thumbUri = getImageUri(this, thumb); 
0

अगर आप कैमरे से छवि प्राप्त वहाँ एक बिटमैप से उरी प्राप्त करने के लिए कोई रास्ता नहीं है, इसलिए आप पहली बार अपने बिटमैप को बचाने चाहिए।

लांच कैमरा आशय

startActivityForResult(Intent(MediaStore.ACTION_IMAGE_CAPTURE), 8) 

तो, ओवरराइड

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 

    if (resultCode == Activity.RESULT_OK && requestCode == 8) { 
     val bitmap = data?.extras?.get("data") as Bitmap 

     val uri = readWriteImage(bitmap) 
    } 
} 

भी बिटमैप की दुकान और फिर वापस जाने के उरी

fun readWriteImage(bitmap: Bitmap): Uri { 
    // store in DCIM/Camera directory 
    val dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) 
    val cameraDir = File(dir, "Camera/") 

    val file = if (cameraDir.exists()) { 
     File(cameraDir, "LK_${System.currentTimeMillis()}.png") 
    } else { 
     cameraDir.mkdir() 
     File(cameraDir, "LK_${System.currentTimeMillis()}.png") 
    } 

    val fos = FileOutputStream(file) 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos) 
    fos.flush() 
    fos.close() 

    Uri.fromFile(file) 
} 

पी एस करने के लिए विधि बनाने के लिए: न अनुमति जोड़ें भूल जाते हैं और रनटाइम अनुमति को संभालें (एपीआई> = 23)