Intent extras 返回 null

Posted

技术标签:

【中文标题】Intent extras 返回 null【英文标题】:Intent extras return null 【发布时间】:2014-11-16 08:36:08 【问题描述】:

我从 girdview 适配器类调用 startActivityForResult 事件。 Gridview 适配器类是由 myFragment 类创建的。 intent extras 总是返回 null onActivityResult 事件。 你认为错误在哪里?谢谢。

我的 gridview 适配器类;

 public class MyAdapter extends ArrayAdapter<MyInfo> 

@Override
public View getView(int position, View convertView, ViewGroup parent) 

    View view = convertView;

    if (view == null) 

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(layoutResourceID, null);

    

    ImageButton btnImage = (ImageButton) view.findViewById(R.id.btnImage);

        @Override
        public boolean onLongClick(View v) 

            Intent intentCamera = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

            intentCamera.putExtra("Asd", "Asd");

            MyFragment.startActivityForResult(intentCamera, 1);

            return true;
        
    );
  

onActivityResult 事件的 MyFragment 类

public class MyFragment extends Fragment 

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 

    super.onActivityResult(requestCode, resultCode, data);

    ImageButton btn = (ImageButton) getActivity().findViewById(R.id.btnImage);

    switch (requestCode) 
    case 1:

        Bitmap photo = (Bitmap) data.getExtras().get("data");

         //photo is OK

        Bundle bundle = data.getExtras();

        if (bundle.getString("Asd") != null) 

            //bundle.getString("Asd")  NULL                         

        if (data.hasExtra("Asd")) 

            //data.hasExtra("Asd") false
        


        break;

    default:
        break;
    



【问题讨论】:

@RichardLeMesurier 我编辑我的代码。 你在哪里返回结果? 对于任何试图在捕获后传递任何值的人,只需使用 public variablepublic static variable 没有其他方法(也许有?但我这样做)。 【参考方案1】:

相机应用不会返回您的自定义字符串“Asd” - 它不是这样工作的。

您可以期望将照片图像或图像文件返回给您。

如果您只是询问“Asd”,那么这就是您的答案 - 您不会得到它。如果您问为什么没有图片返回,请继续阅读。


(作为先前答案的一部分保留)

如果您想保存相机拍摄的照片,您可以按照以下步骤操作:

您需要在Intent 中将正确的数据传递给相机。根据image capture Intent 的 Android 开发者文档:

private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private Uri fileUri;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // create Intent to take a picture and return control to the calling application
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name

    // start the image capture Intent
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

... 其中getOutputMediaFileUri() 方法是您编写的用于创建要保存图像的文件的方法。


有关调用相机应用的更多信息,请参阅以下类似问题:

Android Camera : data intent returns null android camera: onActivityResult() intent is null if it had extras Camera activity returning null android

在那里你会看到更多的工作示例。

【讨论】:

我可以用位图 photo = (Bitmap) data.getExtras().get("data");代码。没有问题。但是我无法获取字符串额外参数。Intent getstringextra return null @lol 是的,这是正确的,那么它只是您想要的“Asd”吗?不幸的是,你不能拥有它...... 我想将图像名称拉到意图。因为我想保存为不同名称的图像。 @lol 如果要保存图像,则必须根据我的答案中的示例调用应用程序 - 请注意,您传入图像将被写入的文件的 URI。然后,相机应用应保存图像,而不是将整个图像返回给您。【参考方案2】:

您正在调用 android 默认相机应用程序 每个活动都可以接受一组预定义的附加内容,并且也将返回相同的内容。 因此,在 OnActivityResult 中找不到此类相机意图的附加功能

例如:intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

【讨论】:

【参考方案3】:

替换这一行:

MyFragment.startActivityForResult(intentCamera, 1);

有了这个:

getApplicationBaseContext().startActivity(intentCamera);

【讨论】:

【参考方案4】:
  Bundle bundle = data.getExtras();

您将intent 拉到bundle 中,而没有在intent 中添加bundle。 如果您需要直接来自意图的字符串,请调用

 data.getStringExtra("Asd")

【讨论】:

以上是关于Intent extras 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

java [Intent Extras to String]转换Intent的Extras为可读的String #Android

使用声明为“Bundle”对象的空变量初始化“intent.extras”

Android:Intent.EXTRA_ALLOW_MULTIPLE 只允许单选

无法在 Intent 中传递自定义对象:方法 Put Extra 对于 Intent 类型不明确

如何在意图“Intent.EXTRA_ALLOW_MULTIPLE”上设置最大文件选择计数。用户最多可以选择一定的限制?

stopService(intent_with_extras) - 你如何从服务中读取这些额外内容以停止?