我使用Intent ACTION_GET_CONTENT
来显示手机记忆库中的最新文件。这包括图像,pdf,谷歌驱动器文档(pdf,xlsx),如下面的屏幕截图所示。我想得到名称和完整路径,以便我可以将文件上传到服务器。我现在正确地获取mime类型。
public class MainActivity extends AppCompatActivity {
Button btn;
TextView txt;
private final static int EXTERNAL = 111;
private final static int ATTACH = 11;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.btn);
txt = (TextView)findViewById(R.id.txt);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
photoIntent();
} else {
if (shouldShowRequestPermissionRationale(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// showToast("Permission Required...");
}
requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL);
}
} else {
photoIntent();
}
}
});
}
private void photoIntent() {
Intent intent = new Intent();
Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath());
intent.setDataAndType(uri, "*/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Complete action using"), ATTACH);
}
@Override
public void onRequestPermissionsResult(int requestcode, String[] permission, int[] grantRes){
if (requestcode == EXTERNAL) {
if (grantRes[0] == PackageManager.PERMISSION_GRANTED) {
photoIntent();
} else {
Toast.makeText(this, "Unable to Access Image", Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == ATTACH && resultCode == RESULT_OK){
Uri uri = data.getData();
System.out.println("sammy_sourceUri "+uri);
String mimeType = getContentResolver().getType(uri);
System.out.println("sammy_mimeType "+ mimeType);
}
}
}

答案 0 :(得分:1)
我想获取名称和完整路径,以便我可以将文件上传到服务器
没有"完整路径",因为可能没有"文件"。
您正在调用ACTION_GET_CONTENT
。这会向某些内容返回Uri
。该内容的来源取决于用户选择的ACTION_GET_CONTENT
活动的开发者。那可能是:
BLOB
列要使用Uri
中的内容,请使用ContentResolver
和openInputStream()
。
如何使用此InputStream作为文件上传到服务器API?
您选择的HTTP API支持InputStream
作为此内容的来源,或者不支持。如果是,请直接使用InputStream
。如果没有,请使用InputStream
将内容的临时副本制作为可以直接访问的文件(例如,在getCacheDir()
中),上传该文件,然后删除上传完成后的文件。
答案 1 :(得分:0)
试试这个
public static ArrayList<String> getImagesFromCameraDir(Context context) {
Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ArrayList<String> filePaths = new ArrayList<>();
final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_ADDED};
Cursor mCursor = context.getContentResolver().query(mImageUri, columns, MediaStore.Images.Media.DATA + " like ? ", new String[]{"%/DCIM/%"}, null);
if (mCursor != null) {
mCursor.moveToFirst();
try {
int uploadImage = 0;
uploadImage = mCursor.getCount();
for (int index = 0; index < uploadImage; index++) {
mCursor.moveToPosition(index);
int idx = mCursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
filePaths.add(mCursor.getString(idx));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
mCursor.close();
}
}
return filePaths;
}
答案 2 :(得分:0)
从URI
获取真实路径public String getRealPathFromURI(Uri contentUri)
{
String[] proj = { MediaStore.Audio.Media.DATA };
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
FILENAME:
String filename = path.substring(path.lastIndexOf("/")+1);