getParcelableExtra方法已过时

Java开发普通蓝牙,报错,提示如下:

img

警告: [deprecation] Intent中的<T>getParcelableExtra(String)已过时
                BluetoothDevice device1 = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                                                ^
  其中, T是类型变量:
    T扩展已在方法 <T>getParcelableExtra(String)中声明的Parcelable

问有什么办法代替?

这只是警告,并不影响运行。getParcelableExtra在33过时:

BluetoothDevice device1;
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
     device1 = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE,BluetoothDevice.class);
 }else {
     device1 = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
}

其实你点进去看源码,就知道替代方法是什么了。

一般java 方法过时后,会在注释上出现一行字,告诉你新的替代类或者替代方法是什么,我刚查了一下gpt,说 建议使用getParcelableExtra(String, ClassLoader)方法来代替。

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE, getClass().getClassLoader());

== 或者你不想用新的方法,你直接在你的这个方法体的上面加个忽略注解@SuppressWarnings("deprecation")==

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    回答:

    在Java开发普通蓝牙时使用getParcelableExtra方法时,如果遇到已过时的问题,可以使用getParcelableExtra(String name, Creator creator)方法来代替。

    具体解决方案如下:

    1.先定义一个Parcelable的实现类:

    public class BlueToothDevice implements Parcelable { //定义需要的属性和方法,参考BluetoothDevice类 //重载Parcelable接口所需的方法 @Override public int describeContents() { return 0; }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        //将需要传递的属性写入Parcel对象
        //参考BluetoothDevice类的 writeToParcel 方法
    }
    
    public static final Creator<BlueToothDevice> CREATOR = new Creator<BlueToothDevice>() {
        public BlueToothDevice createFromParcel(Parcel in) {
            //返回一个新的BlueToothDevice对象和writeToParcel 方法中添加的属性对应
        }
        public BlueToothDevice[] newArray(int size) {
            return new BlueToothDevice[size];
        }
    };
    

    }

    2.在发送广播时,将需要传递的Parcelable对象放入Intent中:

    Intent intent = new Intent("com.example.bluetooth.ACTION_FOUND"); BlueToothDevice device = new BlueToothDevice(); //设置device的属性 intent.putExtra("device", device);

    3.在接收广播时,从Intent中取出Parcelable对象:

    Parcelable parcelable = intent.getParcelableExtra("device"); if (parcelable != null && parcelable instanceof BlueToothDevice) { BlueToothDevice device = (BlueToothDevice) parcelable; //使用device的属性 }

    如果你不想自己定义一个Parcelable类,也可以从官方提供的BluetoothDevice类中取出数据,如下所示:

    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device != null) { String name = device.getName(); String address = device.getAddress(); //使用name和address }

    综上所述,已过时的getParcelableExtra方法可以使用getParcelableExtra(String name, Creator creator)方法来代替。如果需要自己定义Parcelable类,可以参考上面给出的示例代码。如果不想自己定义Parcelable类,也可以从BluetoothDevice类中取出数据。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^