2014-11-05 82 views
4

我想选择gallery.when中的图库意图选择选项从图库中选择图像,然后图库打开并立即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 2014-11-05 09:11:29

+0

是的,我在一些其他片段中使用相同的代码,它工作的很好。同时,你是正确的首先父活动onActivityResult然后片段onActivityResult被调用,但都是在图库打开时调用。 – Ravi 2014-11-05 09:16:26

+0

如果您首先检查请求码会发生什么? – TheRedFox 2014-11-05 10:41:28

回答

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 2014-11-05 09:19:25

+0

现在检查我的答案 – 2014-11-05 09:22:11

+0

感谢您的更新,但仍面临同样的问题。 – Ravi 2014-11-05 09:32:49

1

使用这个打开的android图片选择器:

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

嗨AmitKumar ..上述代码不工作在片段类.. onActivityResult方法不在这里调用... – harikrishnan 2015-10-07 13:42:50

1

#我显示你在我使用的ImageView的一个实例显示图像结果。有两种使用方法1.从相机和2.从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

帮助别人谁是这个bug挣扎,我建议如下:

1.您的片段活动的启动模式

如果你的活动启动模式是“singleInstance” 在如果您离开活动并转到您应该选择图像的活动,则会自动调用onActivityResult。照相机意图也是如此。尝试将您的启动模式更改为“singleTop”或其他任何可替代您现在的启动模式的选项。这样会发生什么,只有当你完成选择图像时才会调用你的activityOnResult。此外,结果将仅从您调用startActivityForResult的地方返回到片段。我会建议你考虑实施dialogueFragment给了选项,用户挑选图片或点击图片

2.你怎么样叫startActivityForResult

它的另一个有趣的事情,如果你打电话从startActivityResult使用片段的本地上下文片段,结果将返回到片段,但如果使用片段活动上下文(如getActivity())调用它,startActivityResult会将结果传回给父片段活动。所以这取决于你想在哪里处理它。 其他重要事情,请致电

超。onActivityResult(requestCode,resultCode,data);

在你的方法中你得到结果。 除了这些尝试遵循其他人提供的使用正确的意图选择图像的建议。

相关问题