【问题标题】:Instantiating WiFiAwareManager Object实例化 WiFiAwareManager 对象
【发布时间】:2018-06-26 22:26:22
【问题描述】:

我正在创建一个应用程序,该应用程序将利用 WiFi Aware 发布服务,但我无法正确调用我实例化的 WiFiAwareManager 对象上的 attach 方法。当我按下触发该方法的按钮时,一切都编译好了,应用程序崩溃了。我在下面添加了我的代码和调试日志。谢谢。

我的代码:

package com.patrickutz.wifiawarepublish;

import android.content.Context;
import android.content.pm.PackageManager;
import android.net.wifi.aware.AttachCallback;
import android.net.wifi.aware.WifiAwareManager;
import android.net.wifi.aware.WifiAwareSession;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.net.wifi.aware.PublishConfig;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {

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

// Constant values of WifiAwareManager
String state_change = WifiAwareManager.ACTION_WIFI_AWARE_STATE_CHANGED;
int data_init = WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR;
int data_resp = WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER;

public void publish(View view) {

    // Check whether or not device supports WiFi Aware
    boolean hasWiFiAware = getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE);

    // Toast myToast = Toast.makeText(this, message, duration);
    // Messages for whether or not device has WiFi Aware
    Toast hasAware = Toast.makeText(this, "WiFi Aware Supported", Toast.LENGTH_SHORT);
    Toast noAware = Toast.makeText(this, "WiFi Aware Unsupported", Toast.LENGTH_SHORT);

    if (hasWiFiAware) {
        hasAware.show();
    } else {
        noAware.show();
    }

    System.out.println(hasWiFiAware);

    // Create WiFiAwareManager object
    WifiAwareManager wifiAwareManager = (WifiAwareManager)getSystemService(Context.WIFI_AWARE_SERVICE);

    AttachCallback attachCallback = new AttachCallback();
    Handler handler = new Handler();

    wifiAwareManager.attach(attachCallback, handler);





    // Get the text views
    TextView showStateChangeTextView = (TextView) findViewById(R.id.stateChangeTextView);
    TextView showDataPathRoleInitTextView = (TextView) findViewById(R.id.dataPathRoleInitTextView);
    TextView showDataPathRoleRespTextView = (TextView) findViewById(R.id.dataPathRoleRespTextView);

    // Display the new values of current state in the text view.
    showStateChangeTextView.setText("State: " + state_change);
    showDataPathRoleInitTextView.setText("Data Initiator: " + Integer.toString(data_init));
    showDataPathRoleRespTextView.setText("Data Responder: " + Integer.toString(data_resp));

    }
}

日志:

06-26 15:18:20.070 7365-7365/com.patrickutz.wifiawarepublish E/AndroidRuntime: FATAL EXCEPTION: main Process: com.patrickutz.wifiawarepublish, PID: 7365 java.lang.IllegalStateException: Could not execute method for android:onClick at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390) at android.view.View.performClick(View.java:6294) at android.view.View$PerformClick.run(View.java:24770) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) at android.view.View.performClick(View.java:6294)  at android.view.View$PerformClick.run(View.java:24770)  at android.os.Handler.handleCallback(Handler.java:790)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:164)  at android.app.ActivityThread.main(ActivityThread.java:6494)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.net.wifi.aware.WifiAwareManager.attach(android.net.wifi.aware.AttachCallback, android.os.Handler)' on a null object reference at com.patrickutz.wifiawarepublish.MainActivity.publish(MainActivity.java:67) at java.lang.reflect.Method.invoke(Native Method)  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)  at android.view.View.performClick(View.java:6294)  at android.view.View$PerformClick.run(View.java:24770)  at android.os.Handler.handleCallback(Handler.java:790)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:164)  at android.app.ActivityThread.main(ActivityThread.java:6494)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

【问题讨论】:

    标签: android android-studio android-wifi


    【解决方案1】:

    API 级别 26 支持 WiFiAwareManager。因此,以下设备将无法使用这些服务。为了避免在这种情况下出现 Null 指针异常,请考虑通过以下代码行检查它的可用性:

    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE)) {
                Log.e("ERROR_TAG", "WiFiAwareManager service is not available."); 
                return;
    }
    //if available then initialize.
    WifiAwareManager was = (WifiAwareManager)getSystemService(WifiAwareManager.class);
    

    参考:https://developer.android.com/reference/android/net/wifi/aware/WifiAwareManager

    【讨论】:

      【解决方案2】:

      一直以来的问题是我在不支持 WiFi Aware 的 Pixel(运行 Android 8.1.0)上运行此代码。当我在 Pixel 2 XL(运行 Android 8.1.0)上运行代码时,代码运行良好,不会导致应用崩溃。值得注意的是,isAvailable() 方法会导致应用在不受支持的设备上崩溃,而不是返回 false。哇! (将就此与 Google 联系)

      【讨论】:

      • 奇怪!从文档中,当您在 27 的 8.1.0 上进行测试时,WiFiAwareManager 被添加到 API 级别 26,它应该可以正常工作。
      猜你喜欢
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多