java - Android Studio 无法解析 com.google.android.gms.nearby.messages.SubscribeOptions.Builder

标签 java android import eddystone google-nearby

我是第一次尝试使用 Google 的附近消息 API。我从 GitHub 下载了一些源代码并尝试使用 Android Studio 进行编译。 Android Studio 无法解析导入:

import com.google.android.gms.nearby.messages.SubscribeOptions;

我的 Gradle 文件定义了以下依赖项:

compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.google.android.gms:play-services:7.8.0'
compile 'com.google.android.gms:play-services-nearby:7.8.0'

这是我使用上述库的Activity:

package com.example.android.nearbybeacons;

import android.Manifest;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.nearby.Nearby;
import com.google.android.gms.nearby.messages.Message;
import com.google.android.gms.nearby.messages.MessageListener;
import com.google.android.gms.nearby.messages.Strategy;
import com.google.android.gms.nearby.messages.SubscribeOptions;

public class MainActivity extends AppCompatActivity implements
        AdapterView.OnItemClickListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {
    private static final String TAG =
            MainActivity.class.getSimpleName();


    private static final int REQUEST_RESOLVE_ERROR = 100;
    private static final int REQUEST_PERMISSION = 42;

    private GoogleApiClient mGoogleApiClient;
    private ArrayAdapter<OfferBeacon> mAdapter;

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

        ListView list = (ListView) findViewById(R.id.list);

        mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
        list.setAdapter(mAdapter);
        list.setOnItemClickListener(this);

        //Construct a connection to Play Services
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(Nearby.MESSAGES_API)
                .build();

        //When launching from a notification link
        if (BeaconService.ACTION_DISMISS.equals(getIntent().getAction())) {
            //Fire a clear action to the service
            Intent intent = new Intent(this, BeaconService.class);
            intent.setAction(BeaconService.ACTION_DISMISS);
            startService(intent);
        }

    }

    @Override
    protected void onStart() {
        super.onStart();
        //Initiate connection to Play Services
        mGoogleApiClient.connect();

        //The location permission is required on API 23+ to obtain BLE scan results
        int result = ActivityCompat
                .checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);
        if (result != PackageManager.PERMISSION_GRANTED) {
            //Ask for the location permission
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                    REQUEST_PERMISSION);
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        //Tear down Play Services connection
        if (mGoogleApiClient.isConnected()) {
            Log.d(TAG, "Un-subscribing…");
            Nearby.Messages.unsubscribe(
                    mGoogleApiClient,
                    mMessageListener);
            mAdapter.clear();

            mGoogleApiClient.disconnect();
        }
    }

    // This is called in response to a button tap in the system permissions dialog.
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_RESOLVE_ERROR) {
            if (resultCode == RESULT_OK) {
                // Permission granted or error resolved successfully then we proceed
                // with publish and subscribe..
                subscribe();
            } else {
                // This may mean that user had rejected to grant nearby permission.
                showToast("Failed to resolve error with code " + resultCode);
            }
        }

        if (requestCode == REQUEST_PERMISSION) {
            if (resultCode != RESULT_OK) {
                showToast("We need location permission to get scan results!");
                finish();
            }
        }
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        OfferBeacon item = mAdapter.getItem(position);
        showToast(item.offer);
    }

    /* Nearby Messages Callbacks */

    //NOTE: These callbacks are NOT triggered on the main thread!
    private MessageListener mMessageListener = new MessageListener() {
        // Called each time a new message is discovered nearby.
        @Override
        public void onFound(Message message) {
            Log.i(TAG, "Found message: " + message);
            final OfferBeacon beacon = new OfferBeacon(message);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mAdapter.add(beacon);
                }
            });
        }
        // Called when the publisher (beacon) is no longer nearby.
        @Override
        public void onLost(Message message) {
            Log.i(TAG, "Lost message: " + message);
            final OfferBeacon beacon = new OfferBeacon(message);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mAdapter.remove(beacon);
                }
            });
        }
    };

    /* API Client Callbacks */
    @Override
    public void onConnected(Bundle bundle) {
        //Once connected, we have to check that the user has opted in
        Runnable runOnSuccess = new Runnable() {
            @Override
            public void run() {
                //Subscribe once user permission is verified
                subscribe();
            }
        };
        ResultCallback<Status> callback =
                new ErrorCheckingCallback(runOnSuccess);
        Nearby.Messages.getPermissionStatus(mGoogleApiClient)
                .setResultCallback(callback);
    }
    @Override
    public void onConnectionSuspended(int i) {
        Log.d(TAG, "OnConnectionSuspended");
    }
    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.w(TAG, "OnConnectionFailed");
    }
    private void subscribe() {
        Log.d(TAG, "Subscribing…");
        SubscribeOptions options = new SubscribeOptions.Builder()
                .setStrategy(Strategy.BLE_ONLY)
                .build();
        //Active subscription for foreground messages
        Nearby.Messages.subscribe(mGoogleApiClient,
                mMessageListener, options);
        //Passive subscription for background messages
        Intent serviceIntent = new Intent(this, BeaconService.class);
        PendingIntent trigger = PendingIntent.getService(this, 0,
                serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        ResultCallback<Status> callback = new BackgroundRegisterCallback();
        Nearby.Messages.subscribe(mGoogleApiClient, trigger, options)
                .setResultCallback(callback);
    }
    private class BackgroundRegisterCallback implements ResultCallback<Status> {
        @Override
        public void onResult(@NonNull Status status) {
            //Validate if we were able to register for background scans
            if (status.isSuccess()) {
                Log.d(TAG, "Background Register Success!");
            } else {
                Log.w(TAG, "Background Register Error ("
                        + status.getStatusCode() + "): "
                        + status.getStatusMessage());
            }
        }
    }
    //ResultCallback triggered when to handle Nearby permissions check
    private class ErrorCheckingCallback implements ResultCallback<Status> {
        private final Runnable runOnSuccess;

        private ErrorCheckingCallback(@Nullable Runnable runOnSuccess) {
            this.runOnSuccess = runOnSuccess;
        }
        @Override
        public void onResult(@NonNull Status status) {
            if (status.isSuccess()) {
                Log.i(TAG, "Permission status succeeded.");
                if (runOnSuccess != null) {
                    runOnSuccess.run();
                }
            } else {
                // Currently, the only resolvable error is that the device is not opted
                // in to Nearby. Starting the resolution displays an opt-in dialog.
                if (status.hasResolution()) {
                    try {
                        status.startResolutionForResult(MainActivity.this,
                                REQUEST_RESOLVE_ERROR);
                    } catch (IntentSender.SendIntentException e) {
                        showToastAndLog(Log.ERROR, "Request failed with exception: " + e);
                    }
                } else {
                    showToastAndLog(Log.ERROR, "Request failed with : " + status);
                }
            }
        }
    }

    private void showToast(String text) {
        Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
    }

    private void showToastAndLog(int logLevel, String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
        Log.println(logLevel, TAG, message);
    }
}

谁能告诉我我做错了什么?

最佳答案

我的猜测是,您可以通过将您使用的 Play 服务版本从 v7.8.0 更新到 v8.4.0(截至本答复日期的最新版本)来解决此问题。 Nearby API 在 v7.8.0 中引入,此时可以使用以下形式的方法签名来完成订阅

subscribe(GoogleApiClient, MessageListener, Strategy)

但是,此方法现已(在 v8.4.0 中)标记为已弃用,建议使用具有以下签名的新方法来代替它:

subscribe (GoogleApiClient, MessageListener, SubscribeOptions)

根据此信息,每当前面描述的弃用发生时,似乎很可能会引入 SubscribeOptions 类型,这显然是在 v7.8.0 后发生的。

参见these docs供引用。

关于java - Android Studio 无法解析 com.google.android.gms.nearby.messages.SubscribeOptions.Builder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35987628/

相关文章:

javascript - 我们在导入未使用的 JS 模块时会出现 "lose"吗?

java - ListView ViewHolder 项目 subview 可见性改变

java - Storm 拓扑中的单例模式

java - 如何监听TextArea中两个按键的代码组合?

objective-c - 在 Objective-C 接口(interface)中 #import 是否总是不合适?

java - Java 导入中的名称冲突

java - 将 jshort 转换为无符号短整型

java - LibGDX:艺术 Assets 无法加载依赖项,因为访问被拒绝

android - 如何根据电话号码查询Android联系人?

android - 如何设置一个空的drawable