получить имя и полный путь к файлу

Я использовал намерение ACTION_GET_CONTENT, чтобы показать последние файлы из памяти телефона. Это включает в себя изображения, pdf, документы Google Диска (pdf, xlsx), как показано на снимке экрана ниже. Я хочу получить имя и полный путь, чтобы загрузить файл на сервер. Я/м получаю правильный тип пантомимы на данный момент.

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);
            


        }

    }
}

введите здесь описание изображения


person Somnath Pal    schedule 14.12.2016    source источник


Ответы (3)


Я хочу получить имя и полный путь, чтобы загрузить файл на сервер.

Нет "полного пути", потому что может не быть "файла".

Вы вызываете ACTION_GET_CONTENT. Это возвращает Uri к некоторому контенту. Откуда берется этот контент, зависит от разработчиков действия ACTION_GET_CONTENT, которое выбрал пользователь. Это может быть:

  • Обычный файл в файловой системе, к которому вы можете получить доступ
  • Обычный файл в файловой системе, который находится где-то, к чему у вас нет доступа, например, во внутренней памяти для другого приложения.
  • Файл, для использования которого требуется какое-либо преобразование, например расшифровка.
  • Столбец BLOB в базе данных
  • Контент, генерируемый «на лету», так же, как эта веб-страница генерируется «на лету» серверами Stack Overflow.
  • И так далее

Чтобы использовать содержимое из Uri, используйте ContentResolver и openInputStream().

как использовать этот InputStream для загрузки на сервер API в виде файла?

Либо выбранный вами HTTP API поддерживает InputStream в качестве источника этого контента, либо нет. Если это так, просто используйте InputStream напрямую. Если нет, используйте InputStream, чтобы создать временную копию контента в виде файла, к которому вы можете получить прямой доступ (например, в getCacheDir()), загрузите этот файл, а затем удалите файл, когда загрузка будет завершена.

person CommonsWare    schedule 14.12.2016

попробуй это

  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;
    }
person Uma Achanta    schedule 14.12.2016
comment
Что делать, если файл не является изображением? Вот где проблема. Это может быть файл с Google Диска, zip-файл или простой PDF-файл. @УмаАчанта - person Somnath Pal; 14.12.2016

получить реальный путь из 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);
}

ИМЯ ФАЙЛА :

String filename = path.substring(path.lastIndexOf("/")+1);
person Prakash Satyani    schedule 14.12.2016