我正在尝试从图像中获取路径以便稍后将其发送到服务器。问题是,当我尝试获取它时,我的代码不起作用(你会看到有一个额外的}
。这是因为来自OnCreate的代码结束然后我踩掉其他函数):
enviar.setOnClickListener(new View.OnClickListener() {
String datos="";
//Bundle extras=getIntent().getExtras();
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, 0);
//Uri imagen=intent.getData();
//datos=imagen.getPath();
//mostrar.setText(datos);
}
});
}
private String getRealPathFromURI(Uri contentURI) {
String result;
Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) {
result = contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
result = cursor.getString(idx);
cursor.close();
}
return result;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode) {
case 0:
if(resultCode == this.RESULT_OK){
try {
final Uri imageUri = imageReturnedIntent.getData();
String path = getRealPathFromURI(imageUri);
mostrar.setText(path);
}
catch (Exception e) {
Log.e("Erroreeeee: ", e.getMessage());
}
}
break;
}
}
答案 0 :(得分:0)
你有两个问题。
第一个是startActivityForResult()
不是即时的。您在下一个陈述中没有任何结果。
因此,欢迎致电startActivityForResult()
,就像我在this sample app中所做的那样:
private void get() {
Intent i=
new Intent()
.setType("image/png")
.setAction(Intent.ACTION_GET_CONTENT)
.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(i, REQUEST_GET);
}
您的结果已发送至onActivityResult()
:
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent resultData) {
if (resultCode==Activity.RESULT_OK) {
Uri image=resultData.getData();
// do something
}
}
你的第二个问题是你在考虑选择一个文件。你不是。您正在使用用户决定处理ACTION_GET_CONTENT
的任何活动来挑选一段内容。如果getPath()
的方案是Uri
,file
只有意义,而且这种方案不太可能。没有可靠的方法来获取任意Uri
的文件系统路径,原因很简单,Uri
不必指向文件。
理想情况下,您的“上传到服务器”逻辑可以使用InputStream
。在这种情况下,请在openInputStream()
上致电ContentResolver
,以获取InputStream
标识的内容Uri
。如果“上传到服务器”逻辑仅适用于文件,请使用InputStream
将内容复制到您控制的某个临时文件(例如,在getCacheDir()
中),然后使用该临时文件上传。完成后删除临时文件。