2016-12-14 4 views
1

Я использовал Intent ACTION_GET_CONTENT, чтобы показать последние файлы из памяти телефона. Это включает в себя изображения, pdf, документы на диске Google (pdf, xlsx), как показано на скриншоте ниже. Я хочу получить имя и полный путь, чтобы я мог загрузить файл на сервер. I/m корректно получает тип 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); 
 
      
 

 

 
     } 
 

 
    } 
 
}

enter image description here

+0

см http://stackoverflow.com/questions/2789276/android-get-real-path-by-uri-getpath – sasikumar

+1

Нет истинного пути. Просто используйте [ContentResolver.openInputStream()] (https://developer.android.com/reference/android/content/ContentResolver.html # openInputStream (android.net.Uri)) – ianhanniballake

+0

Можем ли мы загрузить файл (либо zip-файл, либо файл диска google) на сервер, используя 'ContentResolver.openInputStream()'? @ianhanniballake –

ответ

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; 
    } 
+0

А если файл не является изображением? Это где проблема. Может быть его файлом диска google или zip-файлом или простым pdf. @UmaAchanta –

1

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

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

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

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

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

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

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

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); 
Смежные вопросы