【问题标题】:Attempt to invoke virtual method 'java.lang.Object android.content.Context尝试调用虚拟方法'java.lang.Object android.content.Context
【发布时间】:2020-08-23 07:56:20
【问题描述】:

伙计们,我创建了这个新课程,但是当我在 Main Activity 中调用此函数时出现振动,出现错误

public class vibrate  extends Activity{

public void vibrate() {
        try {
            Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
            // Vibrate for 500 milliseconds
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                v.vibrate(VibrationEffect.createOneShot(200, VibrationEffect.DEFAULT_AMPLITUDE));
            } else {
                //deprecated in API 26
                v.vibrate(200);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
}

我就是这样称呼这个类的

 vibrate v = new vibrate() ;
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        v.vibrate();
       
    }

这是错误

W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference

【问题讨论】:

    标签: java android class


    【解决方案1】:

    vibrate 类是 Activity 的子类,当您创建这样的实例时,您就是在创建一个 Activity。但这不是创建活动的正确方法。

    vibrate v = new vibrate()
    

    您必须在AndroidManifest.xml 文件中声明您的活动,并使用意图调用该活动。

    Intent intent = new Intent(this, vibrate.class);
    startActivity(intent);
    

    但要使用振动器,您只需要这样做。

    public class VibrateActivity extends Activity {
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            vibrate();
        }
    
        private void vibrate() {
            Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
            if (vibrator != null) {
                // Vibrate for 500 milliseconds
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    v.vibrate(VibrationEffect.createOneShot(200, VibrationEffect.DEFAULT_AMPLITUDE));
                } else {
                    //deprecated in API 26
                    v.vibrate(200);
                }
            }
    }
    

    不要忘记在 AndroidManifest.xml 文件中包含权限:

    <uses-permission android:name="android.permission.VIBRATE"/>
    

    更新:
    在活动中使用单独的类而不做。

    public class Vibrate extends Activity {
    
        public void vibrate(Context context) {
            Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
            if (vibrator != null) {
                // Vibrate for 500 milliseconds
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    v.vibrate(VibrationEffect.createOneShot(200, VibrationEffect.DEFAULT_AMPLITUDE));
                } else {
                    //deprecated in API 26
                    v.vibrate(200);
                }
            }
    }
    

    并在您的活动中像这样使用它。

    Vibrate vibrate = new Vibrate();
    vibrate.vibrate(this)
    

    【讨论】:

    • 是的,在我的示例中VibrateActivity 与您的MainActivity 相同,您无需创建另一个活动来执行此操作。
    • 但是有一个问题我不会转向振动活动(制作意图)我需要在振动类中运行所有功能但在MainActivity.java 我不会t 做出意图所以在MainActivity.java 中声明振动类并使用他的函数的最佳方法是什么
    • 只创建一个类,比如说Vibrate,而不从Activity扩展。而且里面也只有一种叫振动的方法。
    • 我以前做过这个,但是当我尝试这样做但像这样protected void onResume()它不起作用,我有很多错误,我使用extends Activity并且也有错误getSystemService是振动功能
    • 很难解释,请查看我的更新。
    【解决方案2】:

    初始化振动 v = new vibrate();在 onCreate() 并调用 v.vibrate(); 无需将振动设为 Activity。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多