一切正常,该应用程序显示。但是,当我单击任何切换按钮时,应用程序就会崩溃。
我尝试过,但是找不到问题。 实际上我没有足够的知识,我是这个领域的新手。所以请帮助我。
这是视图 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)
答案 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
的函数切换时它将为空: