You have two problems.
The first one is that startActivityForResult()
is not immediate. You do not have any results in the next statement.
So, you are welcome to call startActivityForResult()
, as I do in 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);
}
Your results are delivered to onActivityResult()
:
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent resultData) {
if (resultCode==Activity.RESULT_OK) {
Uri image=resultData.getData();
// do something
}
}
Your second problem is that you are thinking that you are picking a file. You are not. You are picking a piece of content, using any activity that the user decides to have handle ACTION_GET_CONTENT
. getPath()
only has meaning if the scheme of the Uri
is file
, and that is rather unlikely. There is no reliable means of getting a filesystem path for an arbitrary Uri
, for the simple reason that the Uri
does not have to point to a file.
Ideally, your "upload to a server" logic can work with an InputStream
. In that case, call openInputStream()
on a ContentResolver
to get an InputStream
on the content identified by the Uri
. If your "upload to a server" logic only works with files, use that InputStream
to copy the content to some temporary file that you control (e.g., in getCacheDir()
), then use that temporary file for your upload. Delete the temporary file when you are done with it.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…