将值传递给onActivityResult

时间:2012-08-31 17:18:54

标签: android

我遇到了将值传递给onActivityResult()方法的问题。这是我的代码:

public class UserUploadActivity extends Activity{

    String userID;
    Uri currImageURI;
    String path;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_upload);
        Bundle gotBundle = getIntent().getExtras();
        userID = gotBundle.getString("key");

        Intent selectImageIntent = new Intent();
        selectImageIntent.setType("image/*");
        selectImageIntent.setAction(Intent.ACTION_GET_CONTENT);

       startActivityForResult(Intent.createChooser(selectImageIntent, "Select Picture"), 1);
    }


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if (resultCode == RESULT_OK)
        {
            if (requestCode == 1) {
            // currImageURI is the global variable I’m using to hold the content:
                currImageURI = data.getData();
                path = getRealPathFromURI(currImageURI);
                //covert to base64 image
                Bitmap bitmapOrg = BitmapFactory.decodeFile(path);
                ByteArrayOutputStream bao = new ByteArrayOutputStream();
                bitmapOrg.compress(Bitmap.CompressFormat.JPEG, 90, bao);
                byte [] ba = bao.toByteArray();
            //pass the base64 code to string and send it to php file
                String ba1=Base64.encodeBytes(ba);


                ArrayList<NameValuePair> nameValuePairs = new

                        ArrayList<NameValuePair>();

                        nameValuePairs.add(new BasicNameValuePair("image",ba1));
                        nameValuePairs.add(new BasicNameValuePair("id",userID));


                        try{

                        HttpClient httpclient = new DefaultHttpClient();

                        HttpPost httppost = new

                        HttpPost("website link");

                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                        HttpResponse response = httpclient.execute(httppost);



                        }catch(Exception e){

                            Toast.makeText(getBaseContext(), "Hindi Gumana", Toast.LENGTH_LONG).show();

                            }


            }
        }
    }// end method onActivityResult

    public String getRealPathFromURI(Uri contentUri)
    {
        String [] proj={MediaStore.Images.Media.DATA};
        android.database.Cursor cursor = managedQuery( contentUri,
        proj,     // Which columns to return
        null,     // WHERE clause; which rows to return (all rows)
        null,     // WHERE clause selection arguments (none)
        null);     // Order-by clause (ascending by name)
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }//end method getRealPathFromURI


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_user_upload, menu);
        return true;
    }


    }

但我唯一的问题是如何将userID的值传递给onActivityResult。已经发布了我的整个代码。我的问题是关于意图。

我已经在onCreate方法中使用toast来查看其值并且其工作正常。但每当我尝试将它传递给onActivityResult时,它总是返回null。

4 个答案:

答案 0 :(得分:0)

如果你使userID成为一个类范围的变量,那么如果你覆盖它,onActivityResult应该有权访问它。

public class Blah extends Activity {
    String userID;
    @Override
    public void onCreate(Bundle savedInstanceState) { 
        // blah blah
        userID = "whatever value";
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        // use userID
    }

答案 1 :(得分:0)

我认为你是从另一个人那里调用这个活动的。您收到的捆绑包不包含我怀疑的“userId”令牌。

userID = gotBundle.getString(“key”);

这是您使用userID的唯一地方。如果您收到“密钥”,您应该能够访问该值。 在上面一行之后不久放一个sysout或toast。

答案 2 :(得分:0)

由于在您的意图开始获取内容时,您的过程可能会终止,因此您需要在已保存的实例状态Bundle中保留该信息,以便在重新创建活动时可以将其取回。

首先将用户ID保存在onSaveInstanceState中。...

public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the userID.
    savedInstanceState.putString("myKey", userID);
    super.onSaveInstanceState(savedInstanceState);
}

然后在onCreate方法中获取如下用户ID

if(savedInstanceState != null) {
       urerID = savedInstanceState.getString("myKey");
}

完成此操作后,您将可以在onActivityResult中获取用户ID。当我尝试此操作时,我遇到了与您相同的问题,它对我有用。

答案 3 :(得分:0)

我意识到这是一个很老的问题,但是我认为这里的问题是传递给onActivityResult()的Intent不一定与传递给startActivityForResult的Intent相同。至少相机活动就是这种情况。 (它将为结果创建一个新的Intent。)

我发现的文档远未明确,但是在我看来,您可以通过通过 Activity调用传递 only 信息。返回onActivityResult)是整数requestCode。如果您无法捕获整数数据,则可以将其用作调用类保存的Map的键。

或者执行我怀疑大多数人所做的事情:将userId放在Activity的实例变量中,然后在onActivityResult中进行检索。 (并且,如果调用方是活动,则您还应该按照Hidayat Ullah's comment的建议进行操作,并将字段值保存为“活动已保存实例”状态。)

更新:Another answer that says the same thing