无法将图像从一个活动发送到另一个活动。请查看详情

Posted

技术标签:

【中文标题】无法将图像从一个活动发送到另一个活动。请查看详情【英文标题】:Failed to send image from one activity to another. Please see details 【发布时间】:2016-01-02 13:42:40 【问题描述】:

我正在从 facebook 获取用户的个人资料图片,我想将其发送到 ProfileActivity.java,以便它可以显示在用户个人资料中。

问题是图像没有从SignUpScreen.java 发送到ProfileActivity.java。虽然我可以将姓名和电子邮件从一个发送到另一个。

这是SignUpScreen.java 文件的代码:

public class SignUpScreen extends AppCompatActivity  

    Button facebookLoginButton;
    CircleImageView mProfileImage;
    TextView mUsername, mEmailID;
    Profile mFbProfile;
    ParseUser user;
    Bitmap bmp = null;
    public String name, email, userID;
    public static final List<String> mPermissions = new ArrayList<String>() 
        add("public_profile");
        add("email");
    ;

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

        TextView textView = (TextView) findViewById(R.id.h);
        Typeface typeface = Typeface.createFromAsset(getBaseContext().getAssets(), "fonts/Pac.ttf");
        textView.setTypeface(typeface);

        mProfileImage = (CircleImageView) findViewById(R.id.user_profile_image);
        mUsername = (TextView) findViewById(R.id.userName);
        mEmailID = (TextView) findViewById(R.id.aboutUser);

        mFbProfile = Profile.getCurrentProfile();

        //mUsername.setVisibility(View.INVISIBLE);
        //mEmailID.setVisibility(View.INVISIBLE);

        facebookLoginButton = (Button) findViewById(R.id.facebook_login_button);
        facebookLoginButton.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 

                ParseFacebookUtils.logInWithReadPermissionsInBackground(SignUpScreen.this, mPermissions, new LogInCallback() 
                    @Override
                    public void done(ParseUser user, ParseException err) 

                        if (user == null) 
                            Log.d("MyApp", "Uh oh. The user cancelled the Facebook login.");
                         else if (user.isNew()) 
                            Log.d("MyApp", "User signed up and logged in through Facebook!");
                            getUserDetailsFromFacebook();
                            final Handler handler3 = new Handler();
                            handler3.postDelayed(new Runnable() 
                                @Override
                                public void run() 
                                    saveNewUser();
                                
                            , 5000);
                         else 
                            Log.d("MyApp", "User logged in through Facebook!");
                        
                    
                );

            
        );

    

    public void saveNewUser() 
        user = new ParseUser();
        user.setUsername(name);
        user.setEmail(email);
        user.setPassword("hidden");

        user.signUpInBackground(new SignUpCallback() 
            @Override
            public void done(ParseException e) 
                if (e == null) 
                    Toast.makeText(SignUpScreen.this, "SignUp Succesful", Toast.LENGTH_LONG).show();
                 else 
                    Toast.makeText(SignUpScreen.this, "SignUp Unsuccesful", Toast.LENGTH_LONG).show();
                    Log.d("error when signingup", e.toString());
                
            
        );
    

    private void getUserDetailsFromFacebook() 

        final GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(),
                new GraphRequest.GraphJSONObjectCallback() 
                    @Override
                    public void onCompleted(
                            JSONObject object,
                            GraphResponse response) 
                        // Application code
                        //Log.d("response", "response" + object.toString());
                        Intent profileIntent = new Intent(SignUpScreen.this, ProfileActivity.class);
                        Bundle b = new Bundle();
                        try 
                            name = response.getJSONObject().getString("name");
                            mUsername.setText(name);
                            email = response.getJSONObject().getString("email");
                            mEmailID.setText(email);
                            userID = response.getJSONObject().getString("id");
                            new ProfilePicAsync().execute(userID);

                            b.putString("userName", name);
                            b.putString("userEmail", email);

                            profileIntent.putExtras(b);
                            profileIntent.putExtra("user_pic", bmp);
                            startActivity(profileIntent);

                         catch (JSONException e) 
                            e.printStackTrace();
                        
                    
                );

        Bundle parameters = new Bundle();
        parameters.putString("fields", "name, email, id");
        request.setParameters(parameters);
        request.executeAsync();

    

    class ProfilePicAsync extends AsyncTask<String, String, String> 

        @Override
        protected String doInBackground(String... params) 

            String imageURL;
            String id = userID;
            imageURL = "https://graph.facebook.com/"+ id +"/picture?type=large";
            try 
                bmp = BitmapFactory.decodeStream((InputStream)new URL(imageURL).getContent());
             catch (Exception e) 
                e.printStackTrace();
                Log.d("Loading picture failed", e.toString());

            

            return null;
        

        @Override
        protected void onPostExecute(String s) 
            super.onPostExecute(s);
            mProfileImage.setImageBitmap(bmp);
        

    

这是ProfileActivity.java 文件的代码:

public class ProfileActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        Bundle bundle = getIntent().getExtras();

        CircleImageView mProfileImage = (CircleImageView) findViewById(R.id.user_profile_image);
        TextView mUsername = (TextView) findViewById(R.id.userName);
        TextView mEmailID = (TextView) findViewById(R.id.aboutUser);

        Bitmap bitmap = (Bitmap) getIntent().getParcelableExtra("user_pic");
        mProfileImage.setImageBitmap(bitmap);

        mUsername.setText(bundle.getString("userName"));
        mEmailID.setText(bundle.getString("userEmail"));

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    


请让我知道这里出了什么问题。

【问题讨论】:

代码太多了。只需发布与问题相关的最低要求代码。 @ParagKadam 我修改了一些代码。请看一看。 您是否已成功将 Facebook 中的图片提取到您的代码中? 然后删除从facebook访问图像的代码。 @ParagKadam 请回答问题。我无法删除它,因为它用于另一段重要的代码。这会迷惑别人!!! 【参考方案1】:

在您的getUserDetailsFromFacebook() 方法中,您调用了new ProfilePicAsync().execute(userID) 来获取图像。但似乎在您获取图像之前,startActivity(profileIntent) 可能会被调用。 在致电startActivity(profileIntent) 之前,请先确保您已从 facebook 获取图片。

编辑

将此添加到您的getUserDetailsFromFacebook()

b.putString("userName", name);
b.putString("userEmail", email);
profileIntent.putExtras(b);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
profileIntent.putExtra("user_pic", byteArray);

startActivity(profileIntent);

将此添加到您的ProfileActivity.java

byte[] byteArray = getIntent().getByteArrayExtra("user_pic");
Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
mProfileImage.setImageBitmap(bmp);

【讨论】:

不!我在那里放了一个处理程序,以便我可以在之前获取图像。它起作用了,我在触发意图之前获取了图像,但后来我也没有得到图像。 此代码导致以下错误:Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null object reference at com.abc.xyz.SignUpScreen$7.onCompleted(SignUpScreen.java:315) 在写bmp.compress(Bitmap.CompressFormat.PNG, 100, stream)之前你有没有打电话给new ProfilePicAsync().execute(userID) 在这种情况下,可能有两种可能性 - 1) 您无法从 facebook 检索图像(您可以通过在您的 SignupScreen 活动中获取 TextView 来确认这一点并显示图像在TextView)。 2)您的startActivity()new ProfilePicAsync().execute(userID) 完成之前被调用,因此bmp 具有null 值。 您应该在您的 asyncTask 的 onPostExecute 中发布此代码 ByteArrayOutputStream stream = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); profileIntent.putExtra("user_pic", byteArray); startActivity(profileIntent) 【参考方案2】:

这不是在同一应用程序中将图像从 Activity 传递到 Activity 的正确方法。您可以轻松地通过意图发送路径并将其加载到其他 Activity。

要将位图保存在Activity A 中,请使用

FileOutputStream out = null;
try 
    out = new FileOutputStream(FILENAME); //FILENAME is your defined place to store image
    bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
 catch (Exception e) 
    e.printStackTrace();
 finally 
    try 
        if (out != null) 
            out.close();
        
     catch (IOException e) 
        e.printStackTrace();
    

现在你有了FILENAME 全局字符串,可以从Activity B 访问。 只需将其加载到需要的位置即可。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeFile(FILENAME, options);
mProfileImage.setImageBitmap(bitmap);

【讨论】:

问题出在哪里兄弟? @HammadNasir 我不知道问题出在哪里。我已成功从 facebook 获取图像,但我不知道为什么它没有从一个活动转移到另一个活动。 图片保存后是否可以看到。首先将此图像保存到SD卡中。然后退出应用程序,看看它是否在 sdcard 中。如果它在那里,尝试在简单的活动中加载它。如果作品在您的应用程序中结合这两个任务。这应该很简单。【参考方案3】:

它对我有用。

OneActivity.java

ByteArrayOutputStream stream = new ByteArrayOutputStream();
                        bm.compress(Bitmap.CompressFormat.PNG, 100, stream);
                        byte[] byteArray = stream.toByteArray();

                        Intent intent = new Intent(StartPage.this, SecondActivity.class);
                        Toast.makeText(StartPage.this, "You have setted this wallpaper for Monday", Toast.LENGTH_LONG).show();
                        intent.putExtra("pic", byteArray);
                        //intent.putExtra("resourseInt", bm);
                        startActivity(intent);

SecondActivity.Java

byte[] byteArray;
Bitmap bmp,
byteArray = getIntent().getByteArrayExtra("pic");
            bmp1 = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

myWallpaperManager.setBitmap(bmp);

【讨论】:

以上是关于无法将图像从一个活动发送到另一个活动。请查看详情的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像从一项活动发送到另一项活动?

无法在Android中将变量值从一个活动发送到另一个活动

如何将当前位置从一项活动发送到另一项活动?

如何在android中将图像从一个活动发送到另一个活动

将图像从活动传递到另一个活动?

如何在不打开的情况下将数据发送到另一个活动