getparcelableextra用法
- 格式:docx
- 大小:37.37 KB
- 文档页数:5
intent.getbooleanextra的用法-回复intent.getBooleanExtra是Android中的一个方法,用于从Intent中获取布尔类型的额外数据。
Intent用于在不同组件之间传递数据,而额外数据可以添加到Intent对象中,以便在多个组件之间共享。
intent.getBooleanExtra方法允许我们从传递的Intent中提取一个布尔类型的额外数据,并返回一个布尔型的值。
在这篇文章中,我们将详细介绍intent.getBooleanExtra方法的使用方法,并提供一些示例,以便更好地理解这个方法的作用和用法。
一、intent.getBooleanExtra 方法的语法和参数解释intent.getBooleanExtra方法的语法如下:public boolean getBooleanExtra(String name, boolean defaultValue)该方法接受两个参数:- name:要提取的额外数据的名称。
- defaultValue:如果在Intent中没有找到指定名称的额外数据,则返回的默认布尔值。
该方法将返回一个布尔型的值,即被提取的额外数据的值。
如果在Intent中没有找到指定名称的额外数据,则返回指定的默认布尔值。
二、intent.getBooleanExtra 的使用示例为了更好地理解intent.getBooleanExtra方法的使用方法,我们将提供以下几个示例。
1. 从一个Activity向另一个Activity传递布尔类型的数据在发送数据的Activity中,首先创建一个Intent对象,并使用putExtra 方法添加一个布尔类型的额外数据:javaIntent intent = new Intent(SenderActivity.this, ReceiverActivity.class);intent.putExtra("isVerified", true);startActivity(intent);在接收数据的Activity中,使用getBooleanExtra方法从Intent中提取该布尔型的额外数据:javaIntent intent = getIntent();boolean isVerified = intent.getBooleanExtra("isVerified", false);上述代码中,如果在Intent中找不到名为"isVerified"的额外数据,则返回的默认值为false。
⼿机蓝⽛检测蓝⽛设备信号强度(RSSI)蓝⽛( Bluetooth® ):是⼀种⽆线技术标准,可实现固定设备、移动设备和楼宇个⼈域⽹之间的短距离数据交换(使⽤2.4—2.485GHz的ISM波段的UHF⽆线电波)。
蓝⽛技术最初由电信巨头爱⽴信公司于1994年创制,当时是作为RS232数据线的替代⽅案。
蓝⽛可连接多个设备,克服了数据同步的难题。
RSSI:Received Signal Strength Indication接收的信号强度指⽰,⽆线发送层的可选部分,⽤来判定链接质量,以及是否增⼤⼴播发送强度。
通过接收到的信号强弱测定信号点与接收点的距离,进⽽根据相应数据进⾏定位计算的⼀种定位技术。
本例是通过⼿机蓝⽛对周围蓝⽛设备进⾏搜索,显⽰出域⽤户输⼊的蓝⽛设备名称相匹配的远程蓝⽛设备的信号强度(RSSI)。
所需权限:<uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/><uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"/>布局⽂件activity_main.xml:<TextViewandroid:id="@+id/showRssi"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="hello_man"/><Buttonandroid:id="@+id/open"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/showRssi"android:layout_below="@+id/showRssi"android:layout_marginTop="24dp"android:onClick="open"android:text="打开蓝⽛"/><Buttonandroid:id="@+id/close"android:onClick="close"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/open"android:layout_alignBottom="@+id/open"android:layout_centerHorizontal="true"android:text="关闭蓝⽛"/><EditTextandroid:id="@+id/bluetoothName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/open"android:layout_marginTop="31dp"android:ems="10"android:hint="请输⼊蓝⽛名称"><requestFocus /></EditText><Buttonandroid:id="@+id/show"android:onClick="show"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/close"android:layout_alignBottom="@+id/close"android:layout_alignParentRight="true"android:text="信号强度"/>布局图:布局为三个按钮,⼀个textview,⼀个editview。
getserializableextra 获取不到数据时的返回值问题:getSerializableExtra 获取不到数据时的返回值在Android开发中,我们经常会使用Intent来进行Activity之间的数据传递。
其中一个常见的方法是通过putExtra和getSerializableExtra来传递和获取Serializable类型的数据。
但是有时候我们会遇到一个问题,就是当我们调用getSerializableExtra时,如果没有找到对应的数据,它会返回什么值呢?事实上,当我们调用getSerializableExtra方法获取Serializable数据的时候,如果没有找到对应的数据,它会返回null。
这个null值表示没有找到对应的数据。
那么为什么会返回null呢?这是因为getSerializableExtra方法是通过键值对的方式来获取数据的,当我们调用putExtra方法将数据放入Intent 中时,会以键值对的形式存储起来。
然后当我们调用getSerializableExtra 方法时,它会根据传入的键来查找对应的值。
如果找不到对应的值,那么就会返回null。
那么当我们获取到null值时,应该如何处理呢?首先,我们需要明确一点,就是获取到null值并不一定意味着出错。
有时候,null值可能是预期的结果。
例如,在某些情况下,我们可能会根据某些条件来判断是否需要传递数据,如果不满足条件,就不会putExtra 数据到Intent 中。
在这种情况下,我们在获取数据时,如果返回null,那就表示没有满足条件需要传递的数据。
然而,在某些情况下,我们可能会期望获取到数据,但是得到了null值。
这可能是因为我们传递数据的时候出了问题。
下面是一些常见的原因和解决方法:1. 检查键是否正确首先,我们需要确保调用getSerializableExtra方法时传入的键值是正确的。
由于键值对是以字符串的形式存储的,因此大小写也是敏感的。
Android 通过两种模式来支持各种 USB 外设和 Android USB 配件(指那些符合 Android 附件协议的 硬件) :USB 配件和 USB 主机。
在 USB 配件的模式之下,外部的 USB 配件就像 USB 主机那样。
这 种配件可以包括机器人控制器,基站连接器,医疗和音乐设备,电话亭以及读卡器这样很多的设备。
这样就使得那些搭载 Android 系统的设备不需要具备主机的特性就可以和 USB 硬件进行交互。
Android USB 配件是指那些专门用来为搭载 Android 系统的设备工作以及符合 Android 附件通信协议 的设备。
在 USB 主机的模式之下, 搭载 Android 的设备就像主机那样工作。
这些设备包括数码相机, 键盘,鼠标以及游戏控制器。
Android USB 设备被设计成具有广泛的应用领域,可以很好的完成人机 互动应用的通信设备。
图 1 就显示了这两种模式的区别。
当搭载 Android 系统的设备处于主机的模式下,它就充当 USB 主机 并且为总线提供能源。
而当搭载 Android 系统的设备处于 USB 配件的模式下时,连接的 USB 硬件(这 种情况下,指的是一个 Android USB 配件)作为主机一样并且为总线提供能源。
在 Android3.1(API12 级)或较新的平台直接支持 USB 配件和主机模式。
USB 配件模式以一个附加 的类库的方式支持范围更广的设备 被移植到 Android 2.3.4(API10 级)。
设备生产商可以决定是否在 系统镜像上附加这个类库。
注意:支持 USB 主机和配件模式主要取决于设备的硬件,而不是平台的等级。
你可以通过一个 [[<uses-feature>]]元素来为设备进行过滤以支持 USB 主机和配件。
看这个 USB 配件和主机文档来 了解更多的详情。
调试注意事项当用 USB 主机或者配件调试应用程序时,你最好有连接到搭载 Android 程序的设备的 USB 硬件。
读取NfcA格式数据如何读取数据?Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);NfcA nfcA = NfcA.get(tag);nfcA.connect();byte[] SELECT = {(byte) 0x30, (byte) 0x05};//我读取的NFC卡⽚使⽤的是NTAG216的芯⽚,这⾥的指令参数是根据其datasheet的说明写的。
byte[] result = nfcA.transceive(SELECT);//这⾥会返回16个字节的数据,根据芯⽚不同会有差异该芯⽚的快速读写命令是0x3A,可以指定读取页数范围,在使⽤快速读写命令时,发现读取范围超过70字节android就会报错,所以使⽤了每次最多读取64字节的⽅式。
package com.yorkg.android.nfc;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.Arrays;import android.app.Activity;import android.app.AlertDialog;import android.app.PendingIntent;import android.content.DialogInterface;import android.content.Intent;import android.content.IntentFilter;import android.nfc.NfcAdapter;import android.nfc.Tag;import android.nfc.tech.MifareClassic;import android.nfc.tech.NfcA;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import com.yorkg.android.nfc.dataobject.mifare.MifareBlock;import com.yorkg.android.nfc.dataobject.mifare.MifareClassCard;import com.yorkg.android.nfc.dataobject.mifare.MifareSector;import com.yorkg.android.nfc.util.Converter;public class MyFirstNFCDemoActivity extends Activity {/** Called when the activity is first created. */private Button clearBtn = null;private EditText sealCompanyName = null;private EditText sealName = null;private EditText sealNumber = null;private EditText sealTaxId = null;private EditText sealCode = null;private EditText sealMaterial = null;private EditText sealSize = null;private EditText companyMadedName = null;private EditText companyMadedTime = null;private EditText companyCheckedName = null;private NfcAdapter mAdapter;private PendingIntent mPendingIntent;private IntentFilter[] mFilters;private String[][] mTechLists;private static final int AUTH = 1;private static final int EMPTY_BLOCK_0 = 2;private static final int EMPTY_BLOCK_1 = 3;private static final int NETWORK = 4;private static final int NFC_OFF = 5;private static final int NFC_TYPE_ERROR = 6;private static final String TAG = "NfcDemo";private static boolean READ_LOCK = false;private void initView(){sealCompanyName = (EditText) this.findViewById(R.id.edittext_seal_company_name);sealName = (EditText) this.findViewById(R.id.edittext_seal_name);sealNumber = (EditText) this.findViewById(R.id.edittext_seal_number);sealTaxId = (EditText) this.findViewById(R.id.edittext_tax_id);sealCode = (EditText) this.findViewById(R.id.edittext_code);sealMaterial = (EditText) this.findViewById(R.id.edittext_seal_material);sealSize = (EditText) this.findViewById(R.id.edittext_seal_size);companyMadedName = (EditText) this.findViewById(R.id.edittext_company_maded_name);companyMadedTime = (EditText) this.findViewById(R.id.edittext_company_maded_time);companyCheckedName = (EditText) this.findViewById(R.id.edittext_company_checked_name);clearBtn = (Button) this.findViewById(R.id.clear_btn);clearBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubcleanData();}});}//清除数据信息private void cleanData(){sealCompanyName.setText("");sealName.setText("");sealNumber.setText("");sealTaxId.setText("");sealCode.setText("");sealMaterial.setText("");sealSize.setText("");companyMadedName.setText("");companyMadedTime.setText("");companyCheckedName.setText("");}@Overridepublic void onCreate(Bundle savedState) {super.onCreate(savedState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(yout.main);initView();mAdapter = NfcAdapter.getDefaultAdapter(this);mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); // Setup an intent filter for all MIME based dispatchesIntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);// try {// ndef.addDataType("*/*");// } catch (MalformedMimeTypeException e) {// throw new RuntimeException("fail", e);// }mFilters = new IntentFilter[] { ndef, };mTechLists = new String[][] { new String[] { MifareClassic.class.getName() } , new String[] {NfcA.class.getName()}};//得到是否检测到ACTION_TECH_DISCOVERED触发if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) {//处理该intentresolveIntentNfcA(getIntent());}}@Overridepublic void onResume() {super.onResume();if (mAdapter!=null && (!mAdapter.isEnabled())) {showAlert(NFC_OFF, getString(R.string.error5));}if (mAdapter!=null) {mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters,mTechLists);}}@Overridepublic void onNewIntent(Intent intent) {resolveIntentNfcA(intent);}@Overridepublic void onPause() {super.onPause();if (mAdapter!=null){mAdapter.disableForegroundDispatch(this);}}void resolveIntentNfcA(Intent intent){if (READ_LOCK==false){READ_LOCK = true;Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())){Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); MyLog.i(TAG, Arrays.toString(tagFromIntent.getTechList()));try{NfcA nfcA = NfcA.get(tag);nfcA.connect();byte[] SELECT = {(byte) 0x30,(byte) 0x05,};byte[] result = nfcA.transceive(SELECT);int data_len = ((result[0]&0x0f)<<8)+((result[1]&0xff));MyLog.i(TAG, "是否已写⼊数据"+result[0]+",写⼊数据长度:"+data_len); byte[] buf_res = new byte[data_len/2+4];if (result[0]!=0 && data_len!=0){int count = data_len/2/64;int i = 0;for (i=0; i<count; i++){// //读取数据byte[] DATA_READ = {(byte) 0x3A,(byte) (0x06+i*(64/4)),(byte) (0x06+(i+1)*(64/4))// (byte) (5+data_len/8)};byte[] data_res = nfcA.transceive(DATA_READ);System.arraycopy(data_res, 0, buf_res, i*64, 64);MyLog.i(TAG, "读卡成功");}if (((data_len/2)%(64))!=0){byte[]DATA_READ = {(byte) 0x3A,(byte) (0x06+i*(64/4)),(byte) (((0x06+i*(64/4))+(data_len/2/4)%(64/4))-1)// (byte) (5+data_len/8)};byte[] data_res = nfcA.transceive(DATA_READ);System.arraycopy(data_res, 0, buf_res, i*64, (data_len/2)%64);MyLog.i(TAG, "读卡成功2");}String res = gb2312ToString(buf_res);MyLog.i(TAG, "stringBytes:"+res);showNFCInfo(res);}}catch(IOException e){e.printStackTrace();cleanData();MyLog.e(TAG, "读卡失败");}catch (Exception e) {// TODO: handle exceptione.printStackTrace();showAlert(NFC_TYPE_ERROR, getString(R.string.error6));}finally{}}READ_LOCK = false;}}//将数据转换为GB2312private String gb2312ToString(byte[] data) {String str = null;try {str = new String(data, "gb2312");//"utf-8"} catch (UnsupportedEncodingException e) {}return str;}//将字符串解析显⽰到页⾯private void showNFCInfo(String str){String[] contents_temp = str.split("\\|");String[] contents = new String[contents_temp.length];int i;for (i = 0; i < contents_temp.length; i++) {contents[i]=contents_temp[i];}//⽬前有10项,所以这⾥只初始化到第10项for (int j=i; j<10; j++){contents[j]="";}if (contents[0]!=null){sealCompanyName.setText(contents[0]);}if (contents[1]!=null){sealName.setText(contents[1]);}if (contents[2]!=null){sealNumber.setText(contents[2]);}if (contents[3]!=null){sealTaxId.setText(contents[3]);}if (contents[4]!=null){sealCode.setText(contents[4]);}if (contents[5]!=null){sealMaterial.setText(contents[5]);}if (contents[6]!=null){sealSize.setText(contents[6]);}if (contents[7]!=null){companyMadedName.setText(contents[7]);}if (contents[8]!=null){companyMadedTime.setText(contents[8]);}if (contents[9]!=null){companyCheckedName.setText(contents[9]);}}private void showAlert(int alertCase,String str) {// prepare the alert boxAlertDialog.Builder alertbox = new AlertDialog.Builder(this); switch (alertCase) {case AUTH:// Card Authentication Erroralertbox.setMessage(getString(R.string.error1));break;case EMPTY_BLOCK_0: // Block 0 Emptyalertbox.setMessage(getString(R.string.error2));break;case EMPTY_BLOCK_1:// Block 1 Emptyalertbox.setMessage(getString(R.string.error3));break;case NETWORK: // Communication Erroralertbox.setMessage(getString(R.string.error4));break;case NFC_OFF:alertbox.setMessage(getString(R.string.error5));break;case NFC_TYPE_ERROR:alertbox.setMessage(getString(R.string.error6));}// set a positive/yes button and create a listeneralertbox.setPositiveButton("OK", new DialogInterface.OnClickListener() { // Save the data from the UI to the database - already donepublic void onClick(DialogInterface arg0, int arg1) {clearFields();}});// display boxalertbox.show();}private void clearFields() {}}。
Androidusb设备权限查询及⾃动获取详解流程看到当上⾯的对话框弹出时,可以使⽤命令查看顶层的活动窗⼝adb shell dumpsys window | findstr mCurrentFocusmCurrentFocus=Window{41ab0ee0 u0 com.android.systemui/bPermissionActivity}这就是应⽤的位置,当然我们也可以是⽤grep命令来查找这个对话框的.xml⽂件,进⼊android源码然后输⼊命令:grep '默认情况下⽤于' ./ -Rn./SystemUI/res/values-zh-rCN/strings.xml:51: <string name="always_use_device" msgid="1450287437017315906">"默认情况下⽤于该 USB 设备"</string>./SystemUI/res/values-zh-rCN/strings.xml:52: <string name="always_use_accessory" msgid="1210954576979621596">"默认情况下⽤于该 USB 配件"</string>那么这个对话框的路径在/android/frameworks/base/packages/SystemUI/res/values-zh-rCN/strings.xml其相关的内容如下:<string name="always_use_device" msgid="1450287437017315906">"默认情况下⽤于该 USB 设备"</string><string name="usb_device_permission_prompt" msgid="834698001271562057">"允许应⽤“<xliff:g id="APPLICATION">%1$s</xliff:g>”访问该 USB 设备吗?"相关应⽤路径找到.java⽂件来修改,其位置在:/android/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java这就是那个讨厌的对话框对应的java程序,那么来看看这个程序如下:/** Copyright (C) 2011 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** /licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package b;import android.app.AlertDialog;import android.app.PendingIntent;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.ApplicationInfo;import android.content.pm.PackageManager;import b.IUsbManager;import bAccessory;import bDevice;import bManager;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.os.ServiceManager;import erHandle;import android.util.Log;import youtInflater;import android.view.View;import android.widget.CheckBox;import poundButton;import android.widget.TextView;import com.android.internal.app.AlertActivity;import com.android.internal.app.AlertController;import com.android.systemui.R;public class UsbPermissionActivity extends AlertActivityimplements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener {private static final String TAG = "UsbPermissionActivity";private CheckBox mAlwaysUse;private TextView mClearDefaultHint;private UsbDevice mDevice;private UsbAccessory mAccessory;private PendingIntent mPendingIntent;private String mPackageName;private int mUid;private boolean mPermissionGranted;private UsbDisconnectedReceiver mDisconnectedReceiver;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);Intent intent = getIntent();mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); mPendingIntent = (PendingIntent)intent.getParcelableExtra(Intent.EXTRA_INTENT);mUid = intent.getIntExtra(Intent.EXTRA_UID, -1);mPackageName = intent.getStringExtra("package");Log.e(TAG, "mPackageName "+ mPackageName);Log.e(TAG, "mUid "+ mUid);PackageManager packageManager = getPackageManager();ApplicationInfo aInfo;try {aInfo = packageManager.getApplicationInfo(mPackageName, 0);} catch (NotFoundException e) {Log.e(TAG, "unable to look up package name", e);finish();return;}String appName = aInfo.loadLabel(packageManager).toString();Log.e(TAG, "appName "+ appName);final AlertController.AlertParams ap = mAlertParams;ap.mIcon = aInfo.loadIcon(packageManager);ap.mTitle = appName;if (mDevice == null) {ap.mMessage = getString(b_accessory_permission_prompt, appName);mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory);} else {ap.mMessage = getString(b_device_permission_prompt, appName);mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice);}ap.mPositiveButtonText = getString(android.R.string.ok);ap.mNegativeButtonText = getString(android.R.string.cancel);ap.mPositiveButtonListener = this;ap.mNegativeButtonListener = this;// add "always use" checkboxLayoutInflater inflater = (LayoutInflater)getSystemService(YOUT_INFLATER_SERVICE);ap.mView = inflater.inflate(yout.always_use_checkbox, null);mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse);if (mDevice == null) {mAlwaysUse.setText(R.string.always_use_accessory);} else {mAlwaysUse.setText(R.string.always_use_device);}mAlwaysUse.setOnCheckedChangeListener(this);mClearDefaultHint = (TextView)ap.mView.findViewById(com.android.internal.R.id.clearDefaultHint);mClearDefaultHint.setVisibility(View.GONE);if(!mPackageName.equals("bcamera"))setupAlert();else{mPermissionGranted = true;finish();}}@Overridepublic void onDestroy() {IBinder b = ServiceManager.getService(USB_SERVICE);IUsbManager service = IUsbManager.Stub.asInterface(b);// send response via pending intentIntent intent = new Intent();try {if (mDevice != null) {intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice);if (mPermissionGranted) {service.grantDevicePermission(mDevice, mUid);if (mAlwaysUse.isChecked()) {final int userId = UserHandle.getUserId(mUid);service.setDevicePackage(mDevice, mPackageName, userId);}}}if (mAccessory != null) {intent.putExtra(UsbManager.EXTRA_ACCESSORY, mAccessory);if (mPermissionGranted) {service.grantAccessoryPermission(mAccessory, mUid);if (mAlwaysUse.isChecked()) {final int userId = UserHandle.getUserId(mUid);service.setAccessoryPackage(mAccessory, mPackageName, userId);}}}intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, mPermissionGranted); mPendingIntent.send(this, 0, intent);} catch (PendingIntent.CanceledException e) {Log.w(TAG, "PendingIntent was cancelled");} catch (RemoteException e) {Log.e(TAG, "IUsbService connection failed", e);}if (mDisconnectedReceiver != null) {unregisterReceiver(mDisconnectedReceiver);}super.onDestroy();}public void onClick(DialogInterface dialog, int which) {if (which == AlertDialog.BUTTON_POSITIVE) {mPermissionGranted = true;}finish();}public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if (mClearDefaultHint == null) return;if(isChecked) {mClearDefaultHint.setVisibility(View.VISIBLE);} else {mClearDefaultHint.setVisibility(View.GONE);}}}这段代码是获取应⽤的包名,我们可以通过包名对⽐来决定是否弹出对话框。
getserializableextra 警告-回复什么是getSerializableExtra警告?在Android开发中,我们经常需要在不同的Activity之间传递数据。
Intent 是一种常用的机制,用于在不同的组件之间传递数据。
通过putExtra方法,我们可以将数据附加到Intent上,然后在目标Activity中使用getExtra 方法来检索数据。
然而,当我们在Intent中传递自定义对象时,我们需要使用getSerializableExtra方法来获取该对象。
然而,有时候Android Studio会给出一个警告,提示我们进行一些更改。
这个警告就是"getSerializableExtra警告"。
为什么会出现getSerializableExtra警告?getSerializableExtra警告是Android Studio的一项功能,旨在帮助开发者改进代码质量和性能。
当我们使用getSerializableExtra方法获取自定义对象时,有时会发生序列化或反序列化问题,导致潜在的慢速性能或内存泄漏问题。
因此,Android Studio会给出这个警告,以提醒开发者进行必要的更改来避免这些问题。
如何解决getSerializableExtra警告?要解决getSerializableExtra警告,我们可以使用更安全和高效的方式传递自定义对象。
以下是一些步骤,可以帮助我们逐步解决这个警告。
第一步:了解警告内容首先,我们需要仔细阅读警告以了解其内容。
警告通常包括一些技术细节和建议,可以帮助我们确定问题的根源。
第二步:考虑使用Parcelable接口替代Serializable接口Android提供了两种主要的对象传递方式:Serializable和Parcelable。
虽然Serializable是更常见的选择,但Parcelable接口在性能方面更为优秀。
getbluetoothdevices的返回值一、概述getBluetoothDevices()是Android平台中的一个方法,用于获取已配对或正在扫描的蓝牙设备列表。
该方法返回一个包含BluetoothDevice对象的List集合。
二、返回值类型List<BluetoothDevice>三、返回值说明1. 如果当前设备没有进行蓝牙配对,则返回空列表。
2. 如果当前设备已经进行了蓝牙配对,则返回已配对的蓝牙设备列表。
3. 如果当前设备正在扫描周围的蓝牙设备,则返回扫描到的蓝牙设备列表。
四、使用方法示例1. 获取已配对的蓝牙设备列表:```BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();List<BluetoothDevice> pairedDevices = new ArrayList<>();Set<BluetoothDevice> devices = mBluetoothAdapter.getBondedDevices();if (devices.size() > 0) {for (BluetoothDevice device : devices) {pairedDevices.add(device);}}```2. 获取正在扫描的蓝牙设备列表:```final List<BluetoothDevice> scanDevices = new ArrayList<>(); final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mBluetoothAdapter.startDiscovery(); BroadcastReceiver mReceiver = new BroadcastReceiver() {public void onReceive(Context context, Intent intent) {String action = intent.getAction();if (BluetoothDevice.ACTION_FOUND.equals(action)) {BluetoothDevice device =intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);scanDevices.add(device);}}};IntentFilter filter = newIntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver, filter);```五、注意事项1. 在使用getBluetoothDevices()方法之前,需要先检查蓝牙是否可用,并且需要获取蓝牙适配器对象。
Android开发实现NFC刷卡读取的两种⽅式场景:NFC是⽬前Android⼿机⼀个主流的配置硬件项,本⽂主要讲解⼀下Android开发中,NFC刷卡的两种实现⽅式以及相关⽅法源码解析。
①:Manifest注册⽅式:这种⽅式主要是在Manifest⽂件对应的activity下,配置过滤器,以响应不同类型NFC Action。
使⽤这种⽅式,在刷卡时,如果⼿机中有多个应⽤都存在该NFC实现⽅案,系统会弹出能响应NFC事件的应⽤列表供⽤户选择,⽤户需要点击⽬标应⽤来响应本次NFC刷卡事件。
⽬前我公司这边项⽬中使⽤了该逻辑,⽐较简便,这⾥先贴⼀下该⽅式的实现逻辑。
Manifest配置:<!--权限要加,这是⼀个普通权限,不需要动态申请,但是在⼩⽶⼿机⾥需要动态申请--><uses-permission android:name="android.permission.NFC" /><uses-featureandroid:name="android.hardware.nfc"android:required="false" /><application>...<activityandroid:name=".NfcActivity"android:launchMode="singleTask"android:screenOrientation="portrait"android:theme="@android:style/Theme.Translucent"><!--透明主题,把刷卡变成⼀个⽆感知的过程--><intent-filter><action android:name="android.nfc.action.NDEF_DISCOVERED" /></intent-filter><intent-filter><action android:name="android.nfc.action.TAG_DISCOVERED" /><category android:name="android.intent.category.DEFAULT" /></intent-filter><intent-filter><action android:name="android.nfc.action.TECH_DISCOVERED" /><!--使⽤这个过滤器这⾥其实还要⽤ meta-data 配置⼀下标签过滤,--><!--我项⽬中是 NDEF_DISCOVERED 这个TECH_DISCOVERED形同虚设--></intent-filter><meta-dataandroid:name="android.nfc.action.TECH_DISCOVERED"android:resource="@xml/nfc_tech" /></activity></application>nfc_tech.xml:这个⽂件就是TECH_DISCOVERED需要配置的,其中,tech-list之间是逻辑或关系,tech之间是逻辑与关系,与⽅案②中的techLists原理以及⽤途是类似的。
java storagevolume 创建方法-回复Java是一种基于对象的编程语言,被广泛应用于软件开发和互联网应用领域。
在Java中,StorageVolume是用于表示存储卷的类。
它提供了一系列方法和属性,用于管理和操作存储卷。
本文将详细介绍StorageVolume 类的创建方法和使用场景。
一、什么是StorageVolume类Java的StorageVolume类位于android.os.storage包中,用于表示存储卷。
存储卷可以是设备的物理存储空间,也可以是虚拟的存储空间,比如外部SD卡或USB存储设备。
StorageVolume类包含了一些操作和属性,例如获取存储卷路径、获取存储卷名称等。
二、创建StorageVolume对象的方法创建StorageVolume对象的方法有多种。
根据具体的使用场景和需求,我们可以选择不同的方法创建StorageVolume对象。
下面将逐步介绍这些方法。
1. 使用Context类的getSystemService方法在Android应用中,我们可以使用Context类的getSystemService方法来获取系统服务的实例。
对于StorageVolume类,我们可以通过该方法获取StorageManager对象,再通过StorageManager对象的getStorageVolumes方法获取StorageVolume对象的列表。
示例代码如下:Context context = getApplicationContext();StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);List<StorageVolume> storageVolumes =storageManager.getStorageVolumes();2. 使用Intent类和StorageVolume.EXTRA_STORAGE_VOLUME另一种创建StorageVolume对象的方法是使用Intent类和StorageVolume.EXTRA_STORAGE_VOLUME。
Android中Intent传递对象的3种⽅式详解前⾔相信Intent的⽤法⼤家已经⽐较熟悉了,Intent可以⽤来启动Activity,Service等等,同时我们也可以通过Intent来进⾏传递数据,当我们使⽤Intent在Activity 间传递信息时发现putExtra()⽅法并不⽀持⾃定义对象的传输,下⾯就来介绍三种解决⽅式。
⼀、Serializable ⽅式这是最简单的⼀种⽅法,因为我们要做的就是让我们⾃定义的对象实现 Serializable 这个空接⼝。
public class Person implements Serializable{private String mName;private String mAddress;public String getName() {return mName;}public void setName(String name) {mName = name;}public String getAddress() {return mAddress;}public void setAddress(String address) {mAddress = address;}}这个时候,就已经可以使⽤Intent 的putExtra() ⽅法传递这个⾃定义对象了,在Activity中这样使⽤Person person = new Person();person.setName("Hwaphon");person.setAddress("Anhui");Intent intent = new Intent(MainActivity.this,SecondActivity.class);intent.putExtra("person",person);startActivity(intent);finish();在Activity中接收数据Intent intent = getIntent();Person person = (Person) intent.getSerializableExtra("person");使⽤Serializable⽅法虽然⼗分简单,但是效率却不容乐观,因为它会把整个对象序列化,开销⼗分⼤,为了追求效率,我们不得不使⽤另⼀种⽅法,也就是Parcelable ⽅法。
对于Android的英文帮助文档,总是看了记不住,远不如对中文资料那么印象深,所以下面的叙述都是对Android帮助文档Bluetooth的翻译。
一、BluetoothAndroid平台包含了对Bluetooth协议栈的支持,允许机器通过Bluetooth设备进行无线数据交换。
应用框架通过Android Bluetooth API访问Bluetooth功能模块。
这些API能让应用无线连接其他Bluetooth设备,实现点对点和多点之间的通信。
运用蓝牙API,Android应用程序可以完成如下操作:1、扫描其他Bluetooth设备。
2、查询配对Bluetooth设备的本地Bluetooth适配器。
3、建立RFCOMM通道。
4、通过服务探索连接到其他设备。
5、与其他设备进行数据传输。
6、管理多个连接二、The Basics本文描述如何使用Android Bluetooth APIs完成Bluetooth通讯的4个必要任务:设置Bluetooth,搜寻本地配对或者可用的Bluetooth设备,连接Bluetooth设备,与Bluetooth 设备进行数据传输。
所有可用的Bluetooth APIs都包含在android.bluetooth包中。
下面是建立Bluetooth连接需要用到的类和接口的总结:1、BluetoothAdapter描述本地Bluetooth适配器(Bluetooth接收器)。
BluetoothAdapter是所有Bluetooth相关活动的入口。
运用BluetoothAdapter可以发现其他Bluetooth设备,查询连接(或配对)的设备列表,用已知MAC地址实例化一个BluetoothDevice对象,创建一个BluetoothServerSocket对象侦听其他设备的通信。
2、BluetoothDevice描述一个远程Bluetooth设备。
可以用它通过一个BluetoothSocket请求一个远程设备的连接,或者查询远程设备的名称、地址、类、连接状态等信息。
intent.getbooleanextra的用法-回复intent.getBooleanExtra是Android programming中的一个方法,用于获取从一个活动(Activity)传递过来的布尔类型的额外数据(extra data)。
在这篇文章中,我将一步一步地解释intent.getBooleanExtra的用法,帮助读者更好地理解和使用这个方法。
首先,让我们来了解一下什么是Intent。
在Android开发中,Intent是一种消息传递机制,用于在不同组件(如活动、服务、广播接收器等)之间传递数据。
Intent可以包含额外的数据,这些数据可以以键值对的形式存在,其中键是一个字符串,值可以是任何Java原始类型、数组或其他数据结构。
Intent中包含的额外数据可以通过调用getIntExtra、getStringExtra等方法进行访问。
对于intent.getBooleanExtra方法而言,它是用于获取从一个活动传递过来的布尔类型额外数据的。
该方法有两个参数:第一个参数是要获取的额外数据的键,第二个参数是如果数据不存在时的默认值。
如果活动之间传递的额外数据中存在与键匹配的布尔类型数据,则该方法返回该数据;否则,返回默认值。
下面是一个具体的示例:java发送位于第一个活动的IntentIntent intent = new Intent(FirstActivity.this, SecondActivity.class); intent.putExtra("isLogged", true);startActivity(intent);接收位于第二个活动的IntentIntent receivedIntent = getIntent();boolean isLogged = receivedIntent.getBooleanExtra("isLogged", false);在这个例子中,我们首先在第一个活动中创建了一个Intent并使用putExtra方法将isLogged键和布尔值true添加到Intent中。
Android蓝⽛连接ESCPOS热敏打印机打印实例(蓝⽛连接篇)公司的⼀个⼿机端的 CRM 项⽬最近要增加⼩票打印的功能,就是我们点外卖的时候经常会见到的那种⼩票。
这⾥主要涉及到两⼤块的知识:1. 蓝⽛连接及数据传输2. ESC/POS 打印指令蓝⽛连接不⽤说了,太常见了,这篇主要介绍这部分的内容。
但ESC/POS 打印指令是个什么⿁?简单说,我们常见的热敏⼩票打印机都⽀持这样⼀种指令,只要按照指令的格式向打印机发送指令,哪怕是不同型号品牌的打印机也会执⾏相同的动作。
⽐如打印⼀⾏⽂本,换⾏,加粗等都有对应的指令,这部分内容放在下⼀篇介绍。
本篇主要基于,相⽐官⽅⽂档,省去了⼤段的说明,更加便于快速上⼿。
1. 蓝⽛权限想要使⽤蓝⽛功能,⾸先要在 AndroidManifest 配置⽂件中声明蓝⽛权限:<manifest><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />...</manifest>BLUETOOTH 权限只允许建⽴蓝⽛连接以及传输数据,但是如果要进⾏蓝⽛设备发现等操作的话,还需要申请BLUETOOTH_ADMIN 权限。
2. 初始配置这⾥主要⽤到⼀个类。
⽤法很简单,直接看代码:BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();if (mBluetoothAdapter == null) {// Device does not support Bluetooth}单例模式,全局只有⼀个实例,只要为 null,就代表设备不⽀持蓝⽛,那么需要有相应的处理。
Android⼿机通过蓝⽛连接佳博打印机的实例代码所使⽤的打印机为佳博打印机,⽀持蓝⽛、wifi、usb我所使⽤的是通过蓝⽛来连接。
在⽹上找到⼀个佳博官⽅针对安卓开发的App源码,但是各种的跳转,没有看太懂,所以⼜去问度娘,找到了⼀个不错的⽂章Android对于蓝⽛开发从2.0版本的sdk才开始⽀持,⽽且模拟器不⽀持,测试⾄少需要两部⼿机,所以制约了很多技术⼈员的开发。
1. ⾸先,要操作蓝⽛,先要在AndroidManifest.xml⾥加⼊权限// 管理蓝⽛设备的权限<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />// 使⽤蓝⽛设备的权限<uses-permissionandroid:name="android.permission.BLUETOOTH" />2.打开蓝⽛获得蓝⽛适配器(android.bluetooth.BluetoothAdapter),检查该设备是否⽀持蓝⽛,如果⽀持,就打开蓝⽛。
// 检查设备是否⽀持蓝⽛adapter = BluetoothAdapter.getDefaultAdapter();if (adapter == null){// 设备不⽀持蓝⽛}// 打开蓝⽛if (!adapter.isEnabled()){Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);// 设置蓝⽛可见性,最多300秒intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);context.startActivity(intent);}3.获取已配对的蓝⽛设备(android.bluetooth.BluetoothDevice)⾸次连接某蓝⽛设备需要先配对,⼀旦配对成功,该设备的信息会被保存,以后连接时⽆需再配对,所以已配对的设备不⼀定是能连接的。
intent.getbooleanextra的用法-回复intent.getBooleanExtra方法是Android中的一个重要方法之一,用于从Intent中获取布尔类型的额外数据。
它在开发中被广泛使用,可以帮助开发者获取传递给Activity或Fragment的额外数据,并根据需要进行相应的操作。
本文将详细介绍intent.getBooleanExtra的用法,从基本概念开始,逐步解释其用法,并通过示例代码进一步说明。
一、基本概念在Android中,Intent作为一种非常重要的通信机制,用于在不同组件之间传递数据。
在使用Intent传递数据时,我们经常需要传递一些额外的信息或参数,以供接收端进行相应的处理。
这些额外的信息可以是各种类型的数据,例如整型、字符串型、布尔型等。
而intent.getBooleanExtra 方法就是用于获取Intent中传递进来的布尔型额外数据。
二、intent.getBooleanExtra的签名在详细了解intent.getBooleanExtra的用法之前,我们先来看一下其方法签名:public boolean getBooleanExtra(String name, boolean defaultValue)其中,name表示要获取的额外数据的名称,defaultValue表示默认值,当获取不到指定名称对应的布尔型额外数据时,将返回默认值。
三、intent.getBooleanExtra的用法1. 获取布尔型额外数据使用intent.getBooleanExtra方法,可以轻松获取Intent中传递过来的布尔型额外数据。
我们可以通过指定名称来获取对应的布尔型值。
例如:boolean extraValue = getIntent().getBooleanExtra("extra_key", false);在上述示例中,我们通过getBooleanExtra方法获取名为"extra_key"的布尔型额外数据,如果获取失败,则返回默认值false。
startactivityforresult传参关于startActivityForResult传参的使用指南在Android开发中,有时需要从一个Activity跳转到另一个Activity,并且希望在跳转后能够获取到另一个Activity返回的数据。
这时就可以使用startActivityForResult方法进行传参,并在返回结果时获取数据。
本文将详细介绍如何使用startActivityForResult来传参,并在返回结果时获取数据。
第一步:理解startActivityForResult方法的基本原理在开始使用startActivityForResult方法之前,我们首先需要了解其基本的使用原理。
startActivityForResult方法用于启动一个新的Activity,并且在新的Activity结束时,将返回的结果传递回来。
我们可以通过设置requestCode参数来标识启动的Activity,以便在返回结果时进行判断和处理。
同时,也可以通过Intent对象的putExtra方法来传递需要的数据。
第二步:在当前Activity中使用startActivityForResult方法进行传参在当前Activity中使用startActivityForResult方法进行传参非常简单,只需要在需要启动另一个Activity的地方调用该方法,并通过Intent对象的putExtra方法来传递需要的数据即可。
例如,我们在一个按钮的点击事件中使用startActivityForResult方法进行传参:javabutton.setOnClickListener(new View.OnClickListener() { Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, SecondActivity.class);intent.putExtra("key", "value");startActivityForResult(intent, REQUEST_CODE);}});上述代码中,我们首先创建一个Intent对象,并通过putExtra方法将需要的数据传递进去,然后使用startActivityForResult方法启动SecondActivity,并设置一个requestCode来标识启动的Activity。
getparcelableextra用法
getParcelableExtra方法是用于获取从Intent中传递的Parcelable 对象的方法。
Parcelable是一个Android特有的接口,用于在不同组件之间传递自定义对象。
使用getParcelableExtra方法的前提是,首先在发送Intent的地方将Parcelable对象添加到Intent中。
可以使用putExtra方法来添加Parcelable对象。
例如,在Activity A中,我们创建一个Parcelable对象并将其添加到Intent中:
```
ParcelableObj obj = new ParcelableObj(;
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("parcelable_obj", obj);
startActivity(intent);
```
然后,在Activity B中,我们可以使用getParcelableExtra方法来获取传递过来的Parcelable对象:
```
ParcelableObj obj =
getIntent(.getParcelableExtra("parcelable_obj");
getParcelableExtra方法接收一个字符串参数,该参数是之前在putExtra方法中添加Parcelable对象时所使用的键值。
通过这个键值,我们可以在接收方获取到正确的Parcelable对象。
需要注意的是,getParcelableExtra方法返回的是一个Parcelable 对象,需要进行类型转换才能使用其中的方法和属性。
另外,如果Intent中没有传递Parcelable对象,或者没有使用指定键值来传递Parcelable对象,那么getParcelableExtra方法将返回null。
在使用getParcelableExtra方法时,还需要保证传递的Parcelable 对象实现了Parcelable接口,并正确地实现了其中的方法。
下面是一个示例,展示如何自定义一个Parcelable对象及其使用方法。
首先,我们创建一个名为Student的类,实现Parcelable接口:
```java
public class Student implements Parcelable
private String name;
private int age;
public Student(String name, int age)
= name;
this.age = age;
protected Student(Parcel in)
name = in.readString(;
age = in.readInt(;
}
public static final Creator<Student> CREATOR = new Creator<Student
public Student createFromParcel(Parcel in)
return new Student(in);
}
public Student[] newArray(int size)
return new Student[size];
}
};
public String getNam
return name;
}
public int getAg
return age;
public int describeContent
return 0;
}
public void writeToParcel(Parcel dest, int flags)
dest.writeString(name);
dest.writeInt(age);
}
```
然后,在Activity A中,我们创建一个Student对象并将其添加到Intent中传递给Activity B:
```java
Student student = new Student("John Doe", 20);
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("student", student);
startActivity(intent);
```
最后,在Activity B中,我们使用getParcelableExtra方法获取传递过来的Student对象,并输出其属性:
```java
Student student = getIntent(.getParcelableExtra("student");
if (student != null)
Log.d("Student Name:", student.getName();
Log.d("Student Age:", String.valueOf(student.getAge());
```
getParcelableExtra方法是非常实用和方便的,可以轻松地在不同组件之间传递自定义对象。
通过正确实现Parcelable接口和使用getParcelableExtra方法,我们可以在Android应用中高效地传递复杂的对象数据。