当我单击任何按钮时,应用将崩溃

时间:2020-03-17 21:54:56

标签: android firebase android-fragments

一切正常,该应用程序显示。但是,当我单击任何切换按钮时,应用程序就会崩溃。

我尝试过,但是找不到问题。 实际上我没有足够的知识,我是这个领域的新手。所以请帮助我。

这是视图 activity.java

package com.wallpaper.wallperx;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.WallpaperManager;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.FileProvider;

import com.github.clans.fab.FloatingActionButton;
import com.github.clans.fab.FloatingActionMenu;
import com.squareup.picasso.Picasso;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;

public class ViewActivity<bgDrawable> extends AppCompatActivity implements View.OnClickListener {

    ImageView imageView;
    FloatingActionMenu floatingActionMenu;
    FloatingActionButton floatingActionButton, btn_set, btn_share, btn_download;
    private static final int PERMISSION_REQUEST_CODE = 1000;

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();
        }

    }


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

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(new String[]{
                        Manifest.permission.WRITE_EXTERNAL_STORAGE
                }, PERMISSION_REQUEST_CODE);
            }

            floatingActionMenu = findViewById(R.id.floatingActionMenu);
            btn_set = findViewById(R.id.SetWallpaper);
            btn_share = findViewById(R.id.ShareWallpaper);
            btn_download = findViewById(R.id.DownloadWallpaper);

            btn_set.setOnClickListener(this);
            btn_share.setOnClickListener(this);
            btn_download.setOnClickListener(this);

            imageView = findViewById(R.id.fullImage);
            Picasso.get().load(getIntent().getStringExtra("images")).into(imageView);
        }


        @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        public void onClick (View v){

            switch (v.getId()) {
                case R.id.SetWallpaper:
                    SetWallpaper();
                    floatingActionButton.toggle(true);
                    break;

                case R.id.ShareWallpaper:
                    ShareWallpaper();
                    floatingActionButton.toggle(true);
                    break;

                case R.id.DownloadWallpaper:
                    saveImage();
                    floatingActionButton.toggle(true);
                    break;
            }
        }

        @RequiresApi(api = Build.VERSION_CODES.M)
        private void saveImage ()
        {
            if (ActivityCompat.checkSelfPermission(ViewActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(ViewActivity.this, "You Should Grant Permission", Toast.LENGTH_SHORT).show();
                if (Build.VERSION.SDK_INT > -Build.VERSION_CODES.M) {
                    requestPermissions(new String[]{
                            Manifest.permission.WRITE_EXTERNAL_STORAGE
                    }, PERMISSION_REQUEST_CODE);
                }
            } else {

                String fileName = UUID.randomUUID().toString() + ".jpg";
                Picasso.get().load(getIntent().getStringExtra("images")).into(new SaveImageHelper(getBaseContext(),
                        getApplicationContext(), getContentResolver(),
                        fileName,
                        "Image Description"));

            }

        }

        @SuppressLint("SetWorldReadable")
        private void ShareWallpaper () {

            Bitmap bitmap = getBitmapFromView(imageView);
            try {
                File file = new File(this.getExternalCacheDir(), "black.png");
                FileOutputStream fOut = new FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
                fOut.flush();
                fOut.close();
                file.setReadable(true, false);
                Intent intent = new Intent(android.content.Intent.ACTION_SEND);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(ViewActivity.this, BuildConfig.APPLICATION_ID + "provider", file));
                intent.setType("image/*");
                startActivity(Intent.createChooser(intent, "Share this image Via"));
            } catch (Exception e) {
                e.printStackTrace();
            }


        }
        private Bitmap getBitmapFromView (View view){
            Bitmap returnBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(returnBitmap);
            Drawable bgDrawable = view.getBackground();
            if (bgDrawable != null)
                bgDrawable.draw(canvas);
            else
                canvas.drawColor(Color.WHITE);
            view.draw(canvas);
            return returnBitmap;
        }

        private void SetWallpaper () {
            Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
            WallpaperManager manager = WallpaperManager.getInstance(getApplicationContext());
            try {
                manager.setBitmap(bitmap);
                Toast.makeText(this, "your Wallpaper set successfully!", Toast.LENGTH_SHORT).show();
            } catch (IOException e) {
                Toast.makeText(this, "Ooh no... its an Error!", Toast.LENGTH_SHORT).show();
            }
        }
    }

和此日志

2020-03-18 03:16:50.407 31609-31609 /? E / lpaper.wallper:在runtime_flags中设置的未知位:0x8000 2020-03-18 03:17:04.862 31609-31609 / com.wallpaper.wallperx E / Android运行时:致命异常:主要 流程:com.wallpaper.wallperx,PID:31609 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void com.github.clans.fab.FloatingActionButton.toggle(boolean)' 在com.wallpaper.wallperx.ViewActivity.onClick(ViewActivity.java:97) 在android.view.View.performClick(View.java:7125) 在android.view.View.performClickInternal(View.java:7102) 在android.view.View.access $ 3500(View.java:801) 在android.view.View $ PerformClick.run(View.java:27336) 在android.os.Handler.handleCallback(Handler.java:883) 在android.os.Handler.dispatchMessage(Handler.java:100) 在android.os.Looper.loop(Looper.java:214) 在android.app.ActivityThread.main(ActivityThread.java:7356) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:492) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

3 个答案:

答案 0 :(得分:0)

该错误说: com.github.clans.fab.FloatingActionButton.toggle(boolean)' on a null object reference at...

如果您遵循floatingActionMenu之类的其他项目的代码,则会看到该项目已分配了一个视图:

floatingActionMenu = findViewById(R.id.floatingActionMenu);

您应该对floatingActionButton执行相同的操作,并在其中执行任何操作之前使用findViewById将布局元素分配给它。与使用onCreate一样,在floatingActionMenu方法中最好的地方是,但是在任何情况下都不是

floatingActionButton = findViewById(R.id.floatingActionButton);

假设floatActionButton在布局上具有ID floatingActionButton

答案 1 :(得分:0)

移动floatActionMenu = findViewById(R.id.floatingActionMenu);外部权限部分,则视图为Null。

floatingActionMenu = findViewById(R.id.floatingActionMenu);
btn_set = findViewById(R.id.SetWallpaper);
btn_share = findViewById(R.id.ShareWallpaper);
btn_download = findViewById(R.id.DownloadWallpaper);

btn_set.setOnClickListener(this);
btn_share.setOnClickListener(this);
btn_download.setOnClickListener(this);

imageView = findViewById(R.id.fullImage);


if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(new String[]{
                        Manifest.permission.WRITE_EXTERNAL_STORAGE
                }, PERMISSION_REQUEST_CODE);
            }
            Picasso.get().load(getIntent().getStringExtra("images")).into(imageView);
        }

答案 2 :(得分:0)

您忘记了它,因此在调用floatingActionButton的函数切换时它将为空:

image of code