Android弹出“发现新标签”,而不是停留在我的应用中

时间:2019-03-13 19:51:51

标签: android android-intent kotlin nfc

当我从应用程序内扫描标签时,Android会打开一个新的默认页面,而不是停留在应用程序页面上并允许我读取内容。更具体地说,显示的页面显示“发现了新标签及其内容。

这是我的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.lorcalhost.wakey">

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

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:launchMode="singleTop">
            <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"/>
                <category android:name="android.intent.category.BROWSABLE" />
            </intent-filter>

        </activity>
    </application>

</manifest>

这是我的MainActivity.kt

import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.nfc.NdefMessage
import android.nfc.NfcAdapter
import android.nfc.NfcManager
import android.os.Bundle
import android.provider.Settings
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat
import android.support.v7.app.AppCompatActivity
import android.view.View
import android.view.WindowManager
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*


class MainActivity : AppCompatActivity(), SensorEventListener {

    private var sensor: Sensor? = null
    private var sensorManager: SensorManager? = null
    private var nfcAdapter : NfcAdapter? = null
    private var nfcPendingIntent: PendingIntent? = null
    private var isRunning = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        checkNFCStatus()

        nfcPendingIntent = PendingIntent.getActivity(this, 0,
            Intent(this, javaClass).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0)

        if (intent != null) {
            processIntent(intent)
        }


        myBackground.setBackgroundColor(Color.rgb(200,224,236))
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
        hideStatusBar()

        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        sensor = sensorManager!!.getDefaultSensor(Sensor.TYPE_LIGHT)

        val actionBar = supportActionBar
        actionBar?.hide()

        btnNFCsettings.setOnClickListener {
            showNFCSettings()
            NFCstatus.visibility = View.INVISIBLE
            btnNFCsettings.visibility = View.INVISIBLE

        }

    }

    override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {

    }

    override fun onSensorChanged(event: SensorEvent?) {
        if (event!!.values[0] < 10 && isRunning == false){
            isRunning = false
            myBackground.setBackgroundColor(Color.rgb(0,0,0))
            NFCsupport.setTextColor(Color.rgb(255, 255, 255))
            NFCstatus.setTextColor(Color.rgb(255, 255, 255))
        }
        else {
            isRunning = false
            myBackground.setBackgroundColor(Color.rgb(200,224,236))
            NFCsupport.setTextColor(Color.rgb(0, 0, 0))
            NFCstatus.setTextColor(Color.rgb(0, 0, 0))
        }


    }

    override fun onResume() {
        super.onResume()
        nfcAdapter?.enableForegroundDispatch(this, nfcPendingIntent, null, null)
        sensorManager!!.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL)

    }

    override fun onPause() {
        super.onPause()
        nfcAdapter?.disableForegroundDispatch(this)
        sensorManager!!.unregisterListener(this)
    }

    override fun onNewIntent(intent: Intent){
        setIntent(intent)
        if (intent != null) processIntent(intent)
    }

    private fun processIntent(checkIntent: Intent) {
        if (checkIntent.action == NfcAdapter.ACTION_NDEF_DISCOVERED) {
            val rawMessages = checkIntent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)
            if (rawMessages != null && rawMessages.isNotEmpty()) {
                val ndefMsg = rawMessages[0] as NdefMessage
                if (ndefMsg.records != null && ndefMsg.records.isNotEmpty()) {
                    val ndefRecord = ndefMsg.records[0]
                    if(ndefRecord.toUri().toString() == "bedroom"){
                        tv_messages.text = ndefRecord.toUri().toString()
                        //logMessage("Done", "recognized")
                    }
                    else {
                        //logMessage("Done", "not recognized")
                    }

                }
            }

        }
    }



    private fun checkNFCStatus(){
        val isNfcSupported: Boolean = nfcAdapter != null
        if (isNfcSupported) {
            NFCsupport.text = "Nfc is not supported on this device"
            Toast.makeText(this, "Nfc is not supported on this device", Toast.LENGTH_SHORT).show()
            finish()
        } else {
            val manager = this.getSystemService(Context.NFC_SERVICE) as NfcManager
            val adapter = manager.defaultAdapter
            if (!(adapter != null && adapter.isEnabled)) {
                NFCstatus.visibility = View.VISIBLE
                btnNFCsettings.visibility = View.VISIBLE
            }
        }
    }

    private fun showNFCSettings() {
        Toast.makeText(this, "You need to enable NFC", Toast.LENGTH_SHORT).show()
        val intent = Intent(Settings.ACTION_NFC_SETTINGS)
        startActivity(intent)
    }

    private fun hideStatusBar(){
        window.setFlags(AccessibilityNodeInfoCompat.ACTION_NEXT_HTML_ELEMENT, AccessibilityNodeInfoCompat.ACTION_NEXT_HTML_ELEMENT)
        window.decorView.systemUiVisibility = 3328
    }

}

我不知道当前配置有什么问题,非常感谢您的帮助。

0 个答案:

没有答案