本文共 4253 字,大约阅读时间需要 14 分钟。
在Android程序中,有时候我们APP需要获取唯一识别码,来区别用户。在Android系统中提供了了AndroidId,但AndroidId有时候会为null,同时root手机用户,androidid可以改变。所以AndroidId并不能作为唯一识别码。
对于Google推荐使用Google Advertising ID,通过Google Service可以获取Google Advertising ID(如果没有Google Service就回去不到Google Advertising ID)。下面看看代码吧
AdvertisingIdClient类
public class AdvertisingIdClient { /** * 这个方法是耗时的,不能在主线程调用 */ public static String getGoogleAdId(Context context) throws Exception { if (Looper.getMainLooper() == Looper.myLooper()) { return "Cannot call in the main thread, You must call in the other thread"; } PackageManager pm = context.getPackageManager(); pm.getPackageInfo("com.android.vending", 0); AdvertisingConnection connection = new AdvertisingConnection(); Intent intent = new Intent( "com.google.android.gms.ads.identifier.service.START"); intent.setPackage("com.google.android.gms"); if (context.bindService(intent, connection, Context.BIND_AUTO_CREATE)) { try { AdvertisingInterface adInterface = new AdvertisingInterface( connection.getBinder()); return adInterface.getId(); } finally { context.unbindService(connection); } } return ""; } private static final class AdvertisingConnection implements ServiceConnection { boolean retrieved = false; private final LinkedBlockingQueuequeue = new LinkedBlockingQueue<>(1); public void onServiceConnected(ComponentName name, IBinder service) { try { this.queue.put(service); } catch (InterruptedException localInterruptedException) { } } public void onServiceDisconnected(ComponentName name) { } public IBinder getBinder() throws InterruptedException { if (this.retrieved) throw new IllegalStateException(); this.retrieved = true; return this.queue.take(); } } private static final class AdvertisingInterface implements IInterface { private IBinder binder; public AdvertisingInterface(IBinder pBinder) { binder = pBinder; } public IBinder asBinder() { return binder; } public String getId() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); String id; try { data.writeInterfaceToken("com.google.android.gms.ads.identifier.internal.IAdvertisingIdService"); binder.transact(1, data, reply, 0); reply.readException(); id = reply.readString(); } finally { reply.recycle(); data.recycle(); } return id; } public boolean isLimitAdTrackingEnabled(boolean paramBoolean) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); boolean limitAdTracking; try { data.writeInterfaceToken("com.google.android.gms.ads.identifier.internal.IAdvertisingIdService"); data.writeInt(paramBoolean ? 1 : 0); binder.transact(2, data, reply, 0); reply.readException(); limitAdTracking = 0 != reply.readInt(); } finally { reply.recycle(); data.recycle(); } return limitAdTracking; } }}
MainActivity类调用
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Executors.newSingleThreadExecutor().execute(new Runnable() { @Override public void run() { try { String adid = AdvertisingIdClient.getGoogleAdId(getApplicationContext()); Log.e("MainActivity", "adid: " + adid); } catch (Exception e) { e.printStackTrace(); } } }); }}
转载地址:http://resvn.baihongyu.com/