首页 > 解决方案 > 尝试在空对象引用上调用虚拟方法“java.lang.String java.io.File.getCanonicalPath()”

问题描述

我在我的应用程序上设置了一个分享按钮,它会截取特定列表视图的屏幕截图,然后让用户分享它。为此,我创建了三种方法:

  1. 截屏
  2. 保存在我的存储中
  3. 分享给用户。

这是我的代码:

Android 清单文件:

<?xml version="1.0" 

encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.transfergame">

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".ViewPlayerHistoryContents" />
    <activity android:name=".CorrectScreen" />
    <activity
        android:name=".DifficultyScreen"
        android:label="Transfer Game">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.example.transfergame.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <!-- ressource file to create -->
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths">
        </meta-data>
    </provider>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>

File_Paths.xml(在 Res 文件夹中):

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="." />
</paths>

主要活动代码:

    package com.example.transfergame;

public class ViewPlayerHistoryContents extends AppCompatActivity {

    public ImageButton shareButton;
public static File imagePath;

public Bitmap takeScreenshot() {
    View rootView = findViewById(android.R.id.content).getRootView();
    rootView.setDrawingCacheEnabled(true);
    return rootView.getDrawingCache();
}

public void saveBitmap(Bitmap bitmap) {
    imagePath = new File(Environment.getExternalStorageDirectory() + "/screenshot.png");
    FileOutputStream fos;
    try {
        fos = new FileOutputStream(imagePath);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        Log.e("GREC", e.getMessage(), e);
    } catch (IOException e) {
        Log.e("GREC", e.getMessage(), e);
    }
}

private void shareIt() {

    File imageFile = null;
    Uri imageUri = FileProvider.getUriForFile(
            ViewPlayerHistoryContents.this,
            "com.example.transfergame.provider", //(use your app signature + ".provider" )
            imageFile);
//    Uri uri = Uri.fromFile(imagePath);
    Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
    sharingIntent.setType("image/*");
    String shareBody = "In Tweecher, My highest score with screen shot";
    sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "My Tweecher score");
    sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
    sharingIntent.putExtra(Intent.EXTRA_STREAM, imageFile);

    startActivity(Intent.createChooser(sharingIntent, "Share via"));
}

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

    shareButton = findViewById(R.id.shareButton);

    View rootView = getWindow().getDecorView().findViewById(android.R.id.content);


    // now setting onClickListener to query button

    shareButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Bitmap bitmap = takeScreenshot();
            saveBitmap(bitmap);
            shareIt();

        }
    });
}

  }

我收到的错误消息是这样的:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.transfergame, PID: 20421
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.io.File.getCanonicalPath()' on a null object reference
    at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:728)
    at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:418)
    at com.example.transfergame.ViewPlayerHistoryContents.shareIt(ViewPlayerHistoryContents.java:149)
    at com.example.transfergame.ViewPlayerHistoryContents.access$000(ViewPlayerHistoryContents.java:30)
    at com.example.transfergame.ViewPlayerHistoryContents$1.onClick(ViewPlayerHistoryContents.java:189)
    at android.view.View.performClick(View.java:6256)
    at android.view.View$PerformClick.run(View.java:24701)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

线

at com.example.transfergame.ViewPlayerHistoryContents.shareIt(ViewPlayerHistoryContents.java:149)

正在谈论

Uri imageUri = FileProvider.getUriForFile(
                ViewPlayerHistoryContents.this,
                "com.example.transfergame.provider", //(use your app signature + ".provider" )
                imageFile);

在我的 shareIt() 方法中,但我不确定为什么这会给我一个错误,因为这与我在我的 android 清单文件中的权限完全匹配。

有没有人知道我做错了什么?

标签: javaandroid

解决方案


推荐阅读