2014-11-05 4 views
4

Я хочу выбрать цель галереи в фрагменте. Когда пользователь выбирает вариант для выбора изображения из галереи, тогда открывается галерея и сразу появляется onActivityResult фрагмента. Когда пользователь выбирает изображение, тогда onActivityResult() является не называется. Так что я не могу выбрать изображение из галереи. Бела мой код, чтобы открыть галерею -Выбрать изображение из галереи в Android Фрагмент

Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    intent.setType("video/, images/"); 
    startActivityForResult(intent, 2); 

и вот мой onActivityResult-

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.d(TAG, "onActivityResult"); // not printed 
    Toast.makeText(mContext, "aaaa"+requestCode, Toast.LENGTH_SHORT).show(); 
} 

Что проблема в моем коде.

Заранее спасибо.

+0

Вы уверены, что можете начать действие для результата из фрагмента без использования ссылки на действие? Я думаю, вы должны поймать результат активности в стартовой деятельности. – TheRedFox

+0

Да, я использую тот же код в каком-то другом фрагменте, и он работает нормально. Также вы являетесь правой родительской активностью onActivityResult, а затем вызывается фрагмент onActivityResult, но оба вызываются, когда галерея открыта. – Ravi

+0

Что произойдет, если вы сначала проверите код запроса? – TheRedFox

ответ

0

использовать этот код для выбора изображения,

Intent intent = new Intent(); 
intent.setType("image/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(Intent.createChooser(intent, "Select image"), 
         PICK_IMAGE); 

Поскольку активность получает результат onActivityResult(), вам нужно будет переопределить свою деятельность в onActivityResult() и вызвать super.onActivityResult() для распространения на соответствующие фрагмент для необработанных кодов результатов или для всех.

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
} 
+0

Я попробовал свой код super.onActivityResult (requestCode, resultCode, data) ; но он все еще вызывает onActivityResult, когда открывается галерея, а не когда я выбрал изображение. – Ravi

+0

теперь проверьте мой ответ –

+0

спасибо за обновление, но все еще сталкиваемся с той же проблемой. – Ravi

1

Используйте это, чтобы открыть андроида Chooser изображения:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), GALLERY_INTENT_CALLED); 
} else { 
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    intent.setType("image/*"); 
    startActivityForResult(intent, GALLERY_KITKAT_INTENT_CALLED); 
} 

и onActivityResult использования этого:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    Cursor cursor = null; 
    if (resultCode != Activity.RESULT_OK) 
     return; 
    if (data == null) 
     return; 
    Uri originalUri = null; 
    if (requestCode == GALLERY_INTENT_CALLED && data != null) { 
     originalUri = data.getData(); 
     String[] filePathColumn = {MediaStore.Images.Media.DATA}; 

     cursor = getActivity().getContentResolver().query(originalUri, 
       filePathColumn, null, null, null); 
     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     filePath = cursor.getString(columnIndex); 
     cursor.close(); 
     Log.d("path of uri", filePath); 

    } else if (requestCode == GALLERY_KITKAT_INTENT_CALLED && data != null) { 
     originalUri = data.getData(); 

     final int takeFlags = data.getFlags() 
       & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
     // Check for the freshest data. 
     getActivity().getContentResolver().takePersistableUriPermission(
       originalUri, takeFlags); 
     Log.d("Uri: ", originalUri.toString()); 

     filePath = getPath(getActivity(), originalUri); 

     Log.d("filepath", filePath); 

    } 

} 

@SuppressLint("NewApi") 
public static String getPath(final Context context, final Uri uri) { 

    final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 

    // DocumentProvider 
    if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { 
     // ExternalStorageProvider 
     if (isExternalStorageDocument(uri)) { 
      final String docId = DocumentsContract.getDocumentId(uri); 
      final String[] split = docId.split(":"); 
      final String type = split[0]; 

      if ("primary".equalsIgnoreCase(type)) { 
       return Environment.getExternalStorageDirectory() + "/" 
         + split[1]; 
      } 

      // TODO handle non-primary volumes 
     } 
     // DownloadsProvider 
     else if (isDownloadsDocument(uri)) { 

      final String id = DocumentsContract.getDocumentId(uri); 
      final Uri contentUri = ContentUris.withAppendedId(
        Uri.parse("content://downloads/public_downloads"), 
        Long.valueOf(id)); 

      return getDataColumn(context, contentUri, null, null); 
     } 
     // MediaProvider 
     else if (isMediaDocument(uri)) { 
      final String docId = DocumentsContract.getDocumentId(uri); 
      final String[] split = docId.split(":"); 
      final String type = split[0]; 

      Uri contentUri = null; 
      if ("image".equals(type)) { 
       contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
      } else if ("video".equals(type)) { 
       contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 
      } else if ("audio".equals(type)) { 
       contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
      } 

      final String selection = "_id=?"; 
      final String[] selectionArgs = new String[]{split[1]}; 

      return getDataColumn(context, contentUri, selection, 
        selectionArgs); 
     } 
    } 
    // MediaStore (and general) 
    else if ("content".equalsIgnoreCase(uri.getScheme())) { 
     return getDataColumn(context, uri, null, null); 
    } 
    // File 
    else if ("file".equalsIgnoreCase(uri.getScheme())) { 
     return uri.getPath(); 
    } 

    return null; 
} 

/** 
* Get the value of the data column for this Uri. This is useful for 
* MediaStore Uris, and other file-based ContentProviders. 
* 
* @param context  The context. 
* @param uri   The Uri to query. 
* @param selection  (Optional) Filter used in the query. 
* @param selectionArgs (Optional) Selection arguments used in the query. 
* @return The value of the _data column, which is typically a file path. 
*/ 
public static String getDataColumn(Context context, Uri uri, 
            String selection, String[] selectionArgs) { 

    Cursor cursor = null; 
    final String column = "_data"; 
    final String[] projection = {column}; 

    try { 
     cursor = context.getContentResolver().query(uri, projection, 
       selection, selectionArgs, null); 
     if (cursor != null && cursor.moveToFirst()) { 
      final int column_index = cursor.getColumnIndexOrThrow(column); 
      return cursor.getString(column_index); 
     } 
    } finally { 
     if (cursor != null) 
      cursor.close(); 
    } 
    return null; 
} 

/** 
* @param uri The Uri to check. 
* @return Whether the Uri authority is ExternalStorageProvider. 
*/ 
public static boolean isExternalStorageDocument(Uri uri) { 
    return "com.android.externalstorage.documents".equals(uri.getAuthority()); 
} 

/** 
* @param uri The Uri to check. 
* @return Whether the Uri authority is DownloadsProvider. 
*/ 
public static boolean isDownloadsDocument(Uri uri) { 
    return "com.android.providers.downloads.documents".equals(uri.getAuthority()); 
} 

/** 
* @param uri The Uri to check. 
* @return Whether the Uri authority is MediaProvider. 
*/ 
public static boolean isMediaDocument(Uri uri) { 
    return "com.android.providers.media.documents".equals(uri.getAuthority()); 
} 
+0

Hi AmitKumar .. вышеупомянутый код не работает в классе фрагментов .. onActivityResult метод не вызывая здесь ... – harikrishnan

1

# Я показываю вам пример, в котором я использовал ImageView для показать результат изображения. Используются два метода: 1. Из камеры и 2.From SD-карта #

public void camera(View view) { 

     Log.i("SonaSys", "startCameraActivity()"); 
     File file = new File(path); 
     Uri outputFileUri = Uri.fromFile(file); 
     Intent intent = new Intent(
       android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
     startActivityForResult(intent, 0); 

    } 

public void gallery(View view) { 

    String path = Environment.getExternalStorageDirectory() 
       + "/images/imagename.jpg"; 
     Intent i = new Intent(Intent.ACTION_PICK, 
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     startActivityForResult(i, RESULT_LOAD_IMAGE); 
    } 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK 
       && null != data) { 

      Uri selectedImage = data.getData(); 
      String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

      Cursor cursor = getContentResolver().query(selectedImage, 
        filePathColumn, null, null, null); 
      cursor.moveToFirst(); 

      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      String picturePath = cursor.getString(columnIndex); 
      cursor.close(); 

      bitmap = BitmapFactory.decodeFile(picturePath); 
      image.setImageBitmap(bitmap); 

      if (bitmap != null) { 
       ImageView rotate = (ImageView) findViewById(R.id.rotate); 
       rotate.setVisibility(View.VISIBLE); 
      } 

     } else { 

      Log.i("SonaSys", "resultCode: " + resultCode); 
      switch (resultCode) { 
      case 0: 
       Log.i("SonaSys", "User cancelled"); 
       break; 
      case -1: 
       onPhotoTaken(); 
       break; 

      } 

     } 

    } 

    protected void onPhotoTaken() { 
     // Log message 
     Log.i("SonaSys", "onPhotoTaken"); 
     taken = true; 
     imgCapFlag = true; 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 4; 
     bitmap = BitmapFactory.decodeFile(path, options); 
     image.setImageBitmap(bitmap); 


    } 
0

Чтобы помочь другим, кто борется с этой ошибкой, я хотел бы предложить следующее:

1. Запуск режима вашего фрагмента активности

если запуск режима вашей деятельности является «SingleInstance» в том, что case onActivityResult будет вызываться автоматически после того, как вы покинете мероприятие и перейдете к активности, где вы должны выбрать изображение. Это верно и для намерения камеры. Попробуйте изменить режим запуска на «singleTop» или что-нибудь в качестве альтернативы режиму запуска, который у вас есть прямо сейчас. Таким образом, произойдет то, что ваша деятельностьOnResult будет вызвана только тогда, когда вы закончите сбор изображения. Также результатом будет возврат к фрагменту только с того места, где вы вызвали startActivityForResult. Я предлагаю вам рассмотреть возможность реализации dialogueFragment для предоставления пользователю возможность выбрать изображение или нажмите изображение

2. как вы назвали startActivityForResult

Его еще одна интересная вещь, если вы называете startActivityResult от фрагмент, используя локальный контекст фрагмента, результат будет возвращен обратно в фрагмент, но если вы его вызовете с использованием контекста активности фрагмента, такого как getActivity(). startActivityResult, результат будет возвращен в действие родительского фрагмента. Так что это зависит от вас, где вы хотите справиться с этим. Другая важная вещь, позвоните по телефону

супер.onActivityResult (requestCode, resultCode, data);

в вашем методе, где вы получаете результат. Помимо этого, попробуйте следующее предложение, которое другой предоставил для выбора изображения с использованием надлежащего намерения.