无法使用片段的画廊获取图像 [英] Can't get the image from gallery using Fragment
本文介绍了无法使用片段的画廊获取图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想从画廊的形象和取代的ImageView的最初形象。但是,即使选择在画廊的形象不会改变。
我检查它是否工作正常,直到使用断点的地方。的的onActivityResult在try-catch以下code部分似乎原因。
中的InputStream = getActivity()getContentResolver()openInputStream(data.getData())。;
什么是图像的原因并没有改变?
公共类片段1片段扩展{ 私有静态最终诠释REQUEST_GALLERY = 0;
私人诠释viewWidth,viewHeight;
私人ImageView的ImageView的; @覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceBundle){ 最后查看视图= inflater.inflate(R.layout.fragment_person_create,集装箱,FALSE);
BMP位图= BitmapFactory.de codeResource(getResources(),R.drawable.image);
ImageView的=(ImageView的)view.findViewById(R.id.image_id);
imageView.setImageBitmap(BMP);
imageView.setOnClickListener(新OnClickListener(){
@覆盖
公共无效的onClick(视图v){
//要图库
意向意图=新的Intent();
intent.setType(图像/ *);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(意向,REQUEST_GALLERY);
}
});
按钮BTN =(按钮)view.findViewById(R.id.bt_saveperson);
btn.setOnClickListener(新OnClickListener(){
@覆盖
公共无效的onClick(视图v){
的EditText名=(EditText上)view.findViewById(R.id.et_name);
/* 保存数据 */
}
}
返回视图。
} @覆盖
公共无效的onActivityResult(INT申请code,INT结果code,意图数据){
如果(要求code == REQUEST_GALLERY&放大器;&安培;结果code == Activity.RESULT_OK){
尝试{
InputStream的在= getActivity()getContentResolver()openInputStream(data.getData())。。
位图位图= BitmapFactory.de codeStream(中);
附寄();
imageView.setImageBitmap(位图);
}赶上(例外五){
}
}
}
}
更新
公共字符串getAbsolutePath(URI URI){
Log.v(标签,666);
如果(Build.VERSION.SDK_INT> = 19){
Log.v(标签,777);
串ID = uri.getLastPathSegment()分割(:)。[1];
Log.v(标签,888);
最终的String [] = imageColumns {MediaStore.Images.Media.DATA};
最后弦乐imageOrderBy = NULL;
乌里tempUri = getUri();
。光标imageCursor = getActivity()getContentResolver()查询(tempUri,imageColumns,MediaStore.Images.Media._ID +=+ ID,空,imageOrderBy);
如果(imageCursor.moveToFirst()){
返回imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
}其他{
返回null;
}
}其他{
的String [] =投影{MediaColumns.DATA};
光标光标= getActivity()getContentResolver()查询(URI,投影,NULL,NULL,NULL);
如果(指针!= NULL){
INT与Column_Index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
cursor.moveToFirst();
返回cursor.getString(Column_Index中);
}其他
返回null;
}
}
}
私人乌里getUri(){
字符串状态= Environment.getExternalStorageState();
如果(!state.equalsIgnoreCase(Environment.MEDIA_MOUNTED))
返回MediaStore.Images.Media.INTERNAL_CONTENT_URI; 返回MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
LogCat中
5月11日至20日:41:20.295:V /标签(1647年):666
5月11日至20日:41:20.295:V /标签(1647年):777
5月11日至20日:41:20.325:W / EGL_emulation(1647年):eglSurfaceAttrib没有实现
5月11日至20日:41:20.575:W / MediaFocusControl(1272):RemoteControlClient死亡
5月11日至20日:41:20.575:I / ActivityManager(1272):杀1498:com.android.music / u0a32(形容词15):空#17
5月11日至20日:41:20.935:I / ActivityManager(1272):杀1437:com.android.printspooler / u0a39(形容词15):空#17
5月11日至20日:41:20.975:D /(935):HostConnection:GET()新主机连接建立0xb7e00a40,TID 1896年
解决方案
使用自定义函数获取Get图像bitamp的绝对路径:
@覆盖
公共无效的onActivityResult(INT申请code,INT结果code,意图数据){
如果(要求code == REQUEST_GALLERY&放大器;&安培;结果code == Activity.RESULT_OK){
尝试{
imageView.setImageBitmap(BitmapFactory.de codeFILE(getAbsolutePath(data.getData())));
}赶上(例外五){
}
}
} 公共字符串getAbsolutePath(URI URI){
如果(Build.VERSION.SDK_INT> = 19){
字符串ID =;
如果(uri.getLastPathSegment()拆分(:)长度大于0){
。ID = uri.getLastPathSegment()分割(:)[1];
}其他{
。ID = uri.getLastPathSegment()分割(:)[0];
}
最终的String [] = imageColumns {MediaStore.Images.Media.DATA};
最后弦乐imageOrderBy = NULL;
乌里tempUri = getUri();
光标imageCursor = getContentResolver()查询(tempUri,imageColumns,MediaStore.Images.Media._ID +=+ ID,空,imageOrderBy)。
如果(imageCursor.moveToFirst()){
返回imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
}其他{
返回null;
}
}其他{
的String [] =投影{MediaColumns.DATA};
光标光标= getContentResolver()查询(URI,投影,NULL,NULL,NULL);
如果(指针!= NULL){
INT与Column_Index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
cursor.moveToFirst();
返回cursor.getString(Column_Index中);
}其他
返回null;
}
}
I want to get the image from the gallery and replace the initial image of the imageView. But it does not change even if select the image in the gallery.
I examined if it works normally until somewhere using the breakpoint. The following code portion of the try-catch of onActivityResult seems the cause.
InputStream in = getActivity().getContentResolver().openInputStream(data.getData());
What is the cause of the image does not change?
public class Fragment1 extends Fragment {
private static final int REQUEST_GALLERY = 0;
private int viewWidth, viewHeight;
private ImageView imageView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceBundle){
final View view = inflater.inflate(R.layout.fragment_person_create, container, false);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.image);
imageView = (ImageView) view.findViewById(R.id.image_id);
imageView.setImageBitmap(bmp);
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// To Gallery
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, REQUEST_GALLERY);
}
});
Button btn = (Button)view.findViewById(R.id.bt_saveperson);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
EditText name = (EditText)view.findViewById(R.id.et_name);
/* save data */
}
}
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == REQUEST_GALLERY && resultCode == Activity.RESULT_OK) {
try {
InputStream in = getActivity().getContentResolver().openInputStream(data.getData());
Bitmap bitmap = BitmapFactory.decodeStream(in);
in.close();
imageView.setImageBitmap(bitmap);
} catch (Exception e) {
}
}
}
}
Update
public String getAbsolutePath(Uri uri) {
Log.v("tag", "666");
if(Build.VERSION.SDK_INT >= 19){
Log.v("tag", "777");
String id = uri.getLastPathSegment().split(":")[1];
Log.v("tag", "888");
final String[] imageColumns = {MediaStore.Images.Media.DATA };
final String imageOrderBy = null;
Uri tempUri = getUri();
Cursor imageCursor = getActivity().getContentResolver().query(tempUri, imageColumns,MediaStore.Images.Media._ID + "="+id, null, imageOrderBy);
if (imageCursor.moveToFirst()) {
return imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
}else{
return null;
}
}else{
String[] projection = { MediaColumns.DATA };
Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, null);
if (cursor != null) {
int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} else
return null;
}
}
}
private Uri getUri() {
String state = Environment.getExternalStorageState();
if(!state.equalsIgnoreCase(Environment.MEDIA_MOUNTED))
return MediaStore.Images.Media.INTERNAL_CONTENT_URI;
return MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
LogCat
11-20 05:41:20.295: V/tag(1647) : 666
11-20 05:41:20.295: V/tag(1647) : 777
11-20 05:41:20.325: W/EGL_emulation(1647) : eglSurfaceAttrib not implemented
11-20 05:41:20.575: W/MediaFocusControl(1272): RemoteControlClient died
11-20 05:41:20.575: I/ActivityManager(1272) : Killing 1498:com.android.music/u0a32 (adj 15): empty #17
11-20 05:41:20.935: I/ActivityManager(1272) : Killing 1437:com.android.printspooler/u0a39 (adj 15): empty #17
11-20 05:41:20.975: D/(935): HostConnection: :get() New Host Connection established 0xb7e00a40, tid 1896
解决方案
Use custom function get Absolute path of get image bitamp :
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == REQUEST_GALLERY && resultCode == Activity.RESULT_OK) {
try {
imageView.setImageBitmap(BitmapFactory.decodeFile(getAbsolutePath(data.getData())));
} catch (Exception e) {
}
}
}
public String getAbsolutePath(Uri uri) {
if(Build.VERSION.SDK_INT >= 19){
String id="";
if(uri.getLastPathSegment().split(":").length>0){
id = uri.getLastPathSegment().split(":")[1];
}else{
id = uri.getLastPathSegment().split(":")[0];
}
final String[] imageColumns = {MediaStore.Images.Media.DATA };
final String imageOrderBy = null;
Uri tempUri = getUri();
Cursor imageCursor = getContentResolver().query(tempUri, imageColumns,MediaStore.Images.Media._ID + "="+id, null, imageOrderBy);
if (imageCursor.moveToFirst()) {
return imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
}else{
return null;
}
}else{
String[] projection = { MediaColumns.DATA };
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
if (cursor != null) {
int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} else
return null;
}
}
这篇关于无法使用片段的画廊获取图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文