нет связи NFC-лучом между смартфоном и Android Wear (Java) - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь отправить строку символов со своего смартфона на мою одежду для Android.Я активировал NFC и луч на смартфоне и NFC на часах.Я положил смартфон на свои часы, но ничего не происходит, кроме звука на моем телефоне

Я пытался искать разные источники в интернете, но, несмотря на свои тесты, я не могу найти источник проблемы.

в манифесте часов

    <uses-permission android:name="android.permission.NFC" />
    <uses-feature android:name="android.hardware.nfc" android:required="true"/>


<activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main"
            >
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="application/com.example.android.beam" />
            </intent-filter>
        </activity>

Я не думаю, что полезно ставить код активности часов, потому что они не запускаются, а потому, что проблема должна быть в восходящем направлении.

в манифесте смартфона

    <uses-permission android:name="android.permission.NFC" />
    <uses-feature android:name="android.hardware.nfc" android:required="true"/>


<activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="application/com.example.android.beam" />
            </intent-filter>
        </activity>

активность смартфона

public class MainActivity extends AppCompatActivity implements NfcAdapter.CreateNdefMessageCallback {

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


        Utils.initializeAll(this, NfcUtils.class); // initialize my NfcUtils library

        NfcUtils.checkAndRequestNfc(this);
        NfcUtils.checkAndRequestBeamNfc(this);

        NfcUtils.setNdefPushMessageCallback(this,this);
    }

    public NdefRecord createMimeRecord(String mimeType, byte[] payload) {
        byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
        NdefRecord mimeRecord = new NdefRecord(
                NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);
        return mimeRecord;
    }

    @Override
    protected void onResume() {
        super.onResume();
        NfcUtils.getNfcAdapter().invokeBeam(this);
    }

    @Override
    public void onNewIntent(Intent intent) {
        // onResume gets called after this to handle the intent
        setIntent(intent);
    }

    @Override
    public NdefMessage createNdefMessage(NfcEvent event) {
        String text = "test";
        NdefMessage msg = new NdefMessage(
                new NdefRecord[] { createMimeRecord(
                        "application/com.example.android.beam", text.getBytes())

                });
        return msg;
    }
}

А для тех, кто хочет разобраться в содержимом моей библиотеки NfcUtils

public class NfcUtils extends Utils {
    private static NfcAdapter mNfcAdapter = null;

    static {
        Utils.register(NfcUtils.class, new String[]{Manifest.permission.NFC});
    }


    static public void initialize(Context context) {
/*
        PackageManager pm = context.getPackageManager();
        // Check whether NFC is available on device
        if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
            // NFC is not available on the device.
            LogUtils.error("The device does not has NFC hardware.");
            return;
        }
        // Check whether device is running Android 4.1 or higher
        else if (!SystemUtils.hasJellyBean()) {
            LogUtils.error("Android Beam is not supported.");
            return;
        }
*/
        mNfcAdapter = NfcAdapter.getDefaultAdapter(context);
    }

    static public void finalize(Context context) {

    }

    static public List<String> getPermissions(Context context, boolean granted) {
        return Utils.getPermissions(context, granted, NfcUtils.class);
    }

    static public boolean checkPermissionsGranted(Context context) {
        return Utils.checkPermissionsGranted(context, NfcUtils.class);
    }

    static public boolean checkAndRequestPermissions(android.app.Activity activity) {
        return Utils.checkAndRequestPermissions(activity, NfcUtils.class);
    }

    static public boolean checkAndRequestPermissions(AppCompatActivity activity) {
        return Utils.checkAndRequestPermissions(activity, NfcUtils.class);
    }

    static public boolean checkAndRequestPermissions(WearableActivity activity) {
        return Utils.checkAndRequestPermissions(activity, NfcUtils.class);
    }


    static public void setNdefPushMessageCallback(Activity activity, NfcAdapter.CreateNdefMessageCallback callback) {
        mNfcAdapter.setNdefPushMessageCallback(callback,activity);
    }

    static public void enableForegroundDispatch(Context context, Activity activity, String mime)
    {
        Intent nfcIntent = new Intent(context, activity.getClass());
        nfcIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent nfcPendingIntent = PendingIntent.getActivity(context, 0, nfcIntent, 0);

        IntentFilter tagIntentFilter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        try {
            tagIntentFilter.addDataType(mime);
            IntentFilter[] intentFiltersArray = new IntentFilter[]{tagIntentFilter};
            mNfcAdapter.enableForegroundDispatch(
                    activity,
                    nfcPendingIntent,
                    intentFiltersArray,
                    null);
        }
        catch (Throwable t) {
            t.printStackTrace();
        }
    }

    static public void disableForegroundDispatch(Activity activity)
    {
        mNfcAdapter.disableForegroundDispatch(activity);
    }

    static public NfcAdapter getNfcAdapter()
    {
        return mNfcAdapter;
    }

    static public void checkAndRequestNfc(Context context)
    {
        if(mNfcAdapter.isEnabled()) return;
        context.startActivity(new Intent(Settings.ACTION_NFC_SETTINGS));
    }


    static public void checkAndRequestBeamNfc(Context context)
    {
       if (mNfcAdapter.isNdefPushEnabled()) return;
        context.startActivity(new Intent(Settings.ACTION_NFCSHARING_SETTINGS));
    }

    static public void setBeamPushUris(Uri[] uris, Activity activity)
    {
        mNfcAdapter.setBeamPushUris(uris, activity);
    }

    static public void setNdefPushMessage(NdefMessage ndefMessage, Activity activity, Activity... activities)
    {
        mNfcAdapter.setNdefPushMessage(ndefMessage, activity,activities);
    }

    static public void setNdefPushMessage(byte[] data, Activity activity, Activity... activities)
    {
        try {
            NdefMessage message = new NdefMessage(data);
            mNfcAdapter.setNdefPushMessage(message, activity,activities);
        } catch (FormatException e) {
            e.printStackTrace();
        }

    }

    static public Parcelable[] getParcelable(@NonNull Intent intent)
    {
        String type = intent.getType();
        String action = intent.getAction();
        if (action.equals(NfcAdapter.ACTION_TAG_DISCOVERED) || action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) {
            return  intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        }
        return new Parcelable[0];
    }

    static public List<NdefMessage> getMessages(@NonNull Parcelable[] parcelables)
    {
        List<NdefMessage> ndefMessageList = new ArrayList<>();

        for (Parcelable p : parcelables) {
            ndefMessageList.add((NdefMessage) p);
        }

        return ndefMessageList;
    }
}

КогдаЯ подхожу к экрану моих часов, где выполняется мое текущее приложение (циферблат), мой смартфон издает звук и выполняет на смартфоне createNdefMessage (), но активность на часах не запускается ...

Я не хочу использовать Bluetooth с обычным API для связи между моими часами и смартфоном, потому что я должен держать Bluetooth выключенным, если мой телефонtch отказывается подключаться к нужной мне точке доступа, поскольку она связана с моим смартфоном.

большое спасибо за вашу помощь.

...