如何获取 class 的上下文
How to get context of class
我有以下 class 并且我尝试获取上下文以便将意图发送给另一个 activity。
public class CloudDocumentTextRecognitionProcessor
extends VisionProcessorBase<FirebaseVisionCloudText> {
public Context mContext;
private FirebaseVisionCloudDocumentTextDetector detector;
public CloudDocumentTextRecognitionProcessor() {
super();
detector = FirebaseVision.getInstance().getVisionCloudDocumentTextDetector();
}
public CloudDocumentTextRecognitionProcessor(Context context) {
this.mContext = context;
}
@Override
protected Task<FirebaseVisionCloudText> detectInImage(FirebaseVisionImage image) {
return detector.detectInImage(image);
}
@Override
protected void onSuccess(
@NonNull FirebaseVisionCloudText text,
@NonNull FrameMetadata frameMetadata,
@NonNull GraphicOverlay graphicOverlay) {
graphicOverlay.clear();
Intent i = new Intent(mContext, ResultActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("key", text.getText());
mContext.startActivity(i);
}
}
但是我在设置意图的行中遇到错误:
"Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference"
我也试过 MyApplication.getContext() 而不是 mContext,但没有结果。
有什么想法吗?
此 class 不继承任何具有上下文的 Android 组件,因此您必须自己注入它。您必须使用将 Context 作为参数的构造函数实例化 class,并将其从 Activity 或其他具有 context/access 的 Android 组件传递给应用上下文。
类似于(伪代码):
Class MyActivity
{
...
imageProcessor = new CloudDocumentTextRecognitionProcessor(this);
// or imageProcessor = new CloudDocumentTextRecognitionProcessor(this.getApplicationContext());
}
如何选择语境?
- 如果
CloudDocumentTextRecognitionProcessor
实例应该在应用程序的整个生命周期中存在,请使用 getApplicationContext()
;
- 如果保证
CloudDocumentTextRecognitionProcessor
实例仅在 Activity 的生命周期内存在,请使用 this
.
您已经为 mContext 字段创建了一个 setter,您可以对传递上下文的 class 使用辅助构造函数。
从您的 activity 中初始化 class 对象,如下所示:
CloudDocumentTextRecognitionProcessor imageProcessor = new CloudDocumentTextRecognitionProcessor(this);
或
CloudDocumentTextRecognitionProcessor imageProcessor = new CloudDocumentTextRecognitionProcessor(getApplicationContext());
我有以下 class 并且我尝试获取上下文以便将意图发送给另一个 activity。
public class CloudDocumentTextRecognitionProcessor
extends VisionProcessorBase<FirebaseVisionCloudText> {
public Context mContext;
private FirebaseVisionCloudDocumentTextDetector detector;
public CloudDocumentTextRecognitionProcessor() {
super();
detector = FirebaseVision.getInstance().getVisionCloudDocumentTextDetector();
}
public CloudDocumentTextRecognitionProcessor(Context context) {
this.mContext = context;
}
@Override
protected Task<FirebaseVisionCloudText> detectInImage(FirebaseVisionImage image) {
return detector.detectInImage(image);
}
@Override
protected void onSuccess(
@NonNull FirebaseVisionCloudText text,
@NonNull FrameMetadata frameMetadata,
@NonNull GraphicOverlay graphicOverlay) {
graphicOverlay.clear();
Intent i = new Intent(mContext, ResultActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("key", text.getText());
mContext.startActivity(i);
}
}
但是我在设置意图的行中遇到错误:
"Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference"
我也试过 MyApplication.getContext() 而不是 mContext,但没有结果。
有什么想法吗?
此 class 不继承任何具有上下文的 Android 组件,因此您必须自己注入它。您必须使用将 Context 作为参数的构造函数实例化 class,并将其从 Activity 或其他具有 context/access 的 Android 组件传递给应用上下文。
类似于(伪代码):
Class MyActivity
{
...
imageProcessor = new CloudDocumentTextRecognitionProcessor(this);
// or imageProcessor = new CloudDocumentTextRecognitionProcessor(this.getApplicationContext());
}
如何选择语境?
- 如果
CloudDocumentTextRecognitionProcessor
实例应该在应用程序的整个生命周期中存在,请使用getApplicationContext()
; - 如果保证
CloudDocumentTextRecognitionProcessor
实例仅在 Activity 的生命周期内存在,请使用this
.
您已经为 mContext 字段创建了一个 setter,您可以对传递上下文的 class 使用辅助构造函数。
从您的 activity 中初始化 class 对象,如下所示:
CloudDocumentTextRecognitionProcessor imageProcessor = new CloudDocumentTextRecognitionProcessor(this);
或
CloudDocumentTextRecognitionProcessor imageProcessor = new CloudDocumentTextRecognitionProcessor(getApplicationContext());