java - 尝试在空对象引用上调用虚拟方法“java.lang.String java.io.File.getCanonicalPath()”
问题描述
我在我的应用程序上设置了一个分享按钮,它会截取特定列表视图的屏幕截图,然后让用户分享它。为此,我创建了三种方法:
- 截屏
- 保存在我的存储中
- 分享给用户。
这是我的代码:
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 清单文件中的权限完全匹配。
有没有人知道我做错了什么?
解决方案
推荐阅读
- kubernetes - 集群一创建master就升级,导致资源安装失败
- c# - 自定义模型绑定 - ASP.NET Core
- reactjs - 将 Strapi 和 MongoDB 部署到服务器
- jenkins - 将参数从 KEY=VALUE 属性文件传递到下游 Jenkins 作业
- bash - 无法理解反引号内反斜杠的非明显使用
- java - 在 Spring Boot 的后台运行线程并能够自动装配
- docusignapi - 调用 EnvelopesApi#update_document_tabs 返回错误
- android - ArrayList、Map.Entry 的问题
) 入口 - visual-studio - MFC:如何修复“待办事项”
(32位)”在任务管理器输出? - python - 如何将 str.format() 与带有一些乳胶的降价文件一起使用