java - 如何使用 Intent 共享从 firebase 服务器获取的数据(图像、标题和描述)...?

标签 java android firebase

我正在设计和 android 应用程序,我成功地从 firebase 获取数据(图像、标题和描述),现在我试图通过使用 Intent 共享所有这些数据......但我每次都失败了......请帮助解决我的问题。这是我的 Activity 页面,我正在其中实现共享数据功能。

MainActivity.Java

package com.timts.swipenews;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Adapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.timts.swipenews.Adapter.MyAdapter;
import com.timts.swipenews.Listener.IFirebaseLoadDone;
import com.timts.swipenews.Model.Movie;
import com.timts.swipenews.Transformer.DeapthPageTransformer;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MainActivity extends AppCompatActivity implements IFirebaseLoadDone {
    private static final String TAG = "MainActivity";
    ViewPager viewPager;
    MyAdapter adapter;
    DatabaseReference movies;
    IFirebaseLoadDone iFirebaseLoadDone;


    TextView mTitleTv, mDetailTV;
    ImageView mImageIv, mShareBtn;
    Bitmap bitmap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTitleTv = findViewById(R.id.movie_title);
        mDetailTV = findViewById(R.id.movie_description);
        mImageIv = findViewById(R.id.movie_image);
        mShareBtn = findViewById(R.id.img_shr);


        //ge dat from server


        byte[] bytes = getIntent().getByteArrayExtra("image");
        String title = getIntent().getStringExtra("title");
        String desc = getIntent().getStringExtra("description");
        Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

        //set data to views
        mTitleTv.setText(title);
        mDetailTV.setText(desc);
        mImageIv.setImageBitmap(bmp);

        //get image from image view

        bitmap = ((BitmapDrawable) mImageIv.getDrawable()).getBitmap();


        movies = FirebaseDatabase.getInstance().getReference("Movies");
        iFirebaseLoadDone = this;
        loadMovie();
        viewPager = (ViewPager) findViewById(R.id.view_pager);
        viewPager.setPageTransformer(true, new DeapthPageTransformer());

        //share btn click handle
        mShareBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                shareImage();

            }
        });


    }


    private void shareImage() {
        try {
            //get title and description save in string s
            String s = mTitleTv.getText().toString() + "\n" + mDetailTV.getText().toString();

            File file = new File(getExternalCacheDir(), "sample.png");
            FileOutputStream fOut = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
            fOut.flush();
            fOut.close();
            file.setReadable(true, false);
            //intent to share image and text
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra(Intent.EXTRA_TEXT, s);//put the text
            intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
            intent.setType("image/png");
            startActivity(Intent.createChooser(intent, "Share Via"));
        } catch (Exception e) {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();

        }
    }

    private void loadMovie() {

        movies.addListenerForSingleValueEvent(new ValueEventListener() {
            List<Movie> movieList = new ArrayList<>();

            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot movieSnapShot : dataSnapshot.getChildren()) {
                    movieList.add(movieSnapShot.getValue(Movie.class));
                    iFirebaseLoadDone.onFirebaseLoadSuccess(movieList);
                }
                Collections.reverse(movieList);
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

                iFirebaseLoadDone.onFirebaseLoadFailed(databaseError.getMessage());

            }
        });
    }

    @Override
    public void onFirebaseLoadSuccess(List<Movie> movieList) {
        adapter = new MyAdapter(this, movieList);
        viewPager.setAdapter(adapter);

    }

    @Override
    public void onFirebaseLoadFailed(String message) {
        Toast.makeText(this, "" + message, Toast.LENGTH_SHORT).show();

    }



}

日志

2019-04-04 11:33:19.878 26508-26508/com.timts.swipenews E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.timts.swipenews, PID: 26508
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.timts.swipenews/com.timts.swipenews.MainActivity}: java.lang.NullPointerException: Attempt to get length of null array
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3121)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3260)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1976)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6912)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:860)
     Caused by: java.lang.NullPointerException: Attempt to get length of null array
        at com.timts.swipenews.MainActivity.onCreate(MainActivity.java:74)
        at android.app.Activity.performCreate(Activity.java:7144)
        at android.app.Activity.performCreate(Activity.java:7135)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1293)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3101)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3260) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1976) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6912) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:860) 

最佳答案

您在第 74 行得到 NullPointerException。您的 Intent 值可以是 null,尤其是 getIntent().getByteArrayExtra("image")。 logcat 显示 Attempt to get the length of null array。您应该确保该数组不是 null。最好的方法是调试。

编辑:

byte[] bytes = getIntent().getByteArrayExtra("image");
String title = getIntent().getStringExtra("title");
String desc = getIntent().getStringExtra("description");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Drawable drawable = new BitmapDrawable(getResources(), bitmap);

//set data to views
mTitleTv.setText(title);
mDetailTV.setText(desc);
mImageIv.setImageDrawable(drawable)

关于java - 如何使用 Intent 共享从 firebase 服务器获取的数据(图像、标题和描述)...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55509410/

相关文章:

android - ClassNotFoundException DynamiteModuleInitializer Android

java - Derby 通过打开的数据库连接获取 CLOB 失败

Swift Firebase 查询在过滤 uid 时返回 null

java - 从 json 创建 java 对象列表

java - ScrollView TextView

android - 人脸检测不工作

android - 在 Android 的 ScrollView 内的 View 中进行自定义位图 blitting 时,如何确定是否会在屏幕外绘制

ios - Firebase .childAdded 在 Xcode 中产生重复输出

java - 在 ExecutorService 上调用 shutdown() 的原因

java - 为 json 字符串创建通用 java 映射器