在某個點擊事件中,我要求用戶添加圖像。所以我提供了兩種選擇:如何從位圖獲取Uri對象
- 從圖庫中添加。
- 從相機中點擊新圖像。
我的目標是保留與這些圖像相關的「uri」列表。
如果用戶選擇畫廊,那麼我得到的圖像uri(這很簡單)。 但是,如果他選擇了照相機,然後拍照後,我得到該圖片的位圖對象。
現在我該如何將該位圖對象轉換爲uri,換句話說,我該如何獲取該位圖對象的相對Uri對象?
謝謝。
在某個點擊事件中,我要求用戶添加圖像。所以我提供了兩種選擇:如何從位圖獲取Uri對象
我的目標是保留與這些圖像相關的「uri」列表。
如果用戶選擇畫廊,那麼我得到的圖像uri(這很簡單)。 但是,如果他選擇了照相機,然後拍照後,我得到該圖片的位圖對象。
現在我該如何將該位圖對象轉換爲uri,換句話說,我該如何獲取該位圖對象的相對Uri對象?
謝謝。
我試着從post I mentioned in my comment..下面的代碼片段,它對我來說工作正常。
/**
* 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;
}
}
輸出的logcat:
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名。 希望這有助於。
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();
}
我有同樣的問題,在我的項目,所以我按照簡單的方法(click here)從位圖得到URI。
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);
}
'Images.Media.insertImage'現在是'你需要記住添加此權限MediaStore.Images.Media.insertImage'第二件事:'<使用許可權的android :name =「android.permission.WRITE_EXTERNAL_STORAGE」/>' –
它在android 6.0中返回null路徑 –
兩個棉花糖設備,摩托羅拉'返回路徑',但三星'返回null'。任何幫助? – sud007
Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
上述創建使用位圖的縮略圖行,可能會消耗你的Android設備的一些額外的空間。
此方法可以幫助您從位圖中獲取Uri而不消耗一些額外的內存。
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;
}
這就是爲我工作的。例如以位圖的形式從視頻獲取縮略圖。然後我們可以將位圖對象轉換爲uri對象。
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);
如果從相機獲得的圖像也沒有辦法從位圖得到開放的,所以你應該先救你的位圖。
啓動相機意圖
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)
}
PS:不要忘了添加權限和處理運行時權限(API> = 23)
這可能有助於http:// stackoverflow。com/questions/7636697/get-path-and-filename-from-camera-intent-result –
一些代碼非常硬編碼。 我不想硬編碼圖像的文件名。 並不見得圖像保存在DCIM文件夾.. –