2017-12-11 26 views

答えて

0

助けてください。あなたはこのように、MotionEventの基本データを抽出することができます。

// AIDLデータ

public class Data implements Parcelable { 
private long downTime; 
private long eventTime; 
private int action; 
private float x; 
private float y; 
private float pressure; 
private float size; 
private int metaState; 
private float xPrecision; 
private float yPrecision; 
private int deviceId; 
private int edgeFlags; 

private Data(Parcel source){ 
    readFromParcel(source); 
} 

public Data(){ 
} 

public static Data.Creator<Data> CREATOR= new Creator<Data>() { 
    @Override 
    public Data createFromParcel(Parcel source) { 
     return new Data(source); 
    } 

    @Override 
    public Data[] newArray(int size) { 
     return new Data[size]; 
    } 
}; 


@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeLong(downTime); 
    dest.writeLong(eventTime); 
    dest.writeInt(action); 
    dest.writeFloat(x); 
    dest.writeFloat(y); 
    dest.writeFloat(pressure); 
    dest.writeFloat(size); 
    dest.writeInt(metaState); 
    dest.writeFloat(xPrecision); 
    dest.writeFloat(yPrecision); 
    dest.writeInt(deviceId); 
    dest.writeInt(edgeFlags);  
} 

public void readFromParcel(Parcel source){ 
    edgeFlags=source.readInt(); 
    deviceId=source.readInt(); 
    yPrecision=source.readFloat(); 
    xPrecision=source.readFloat(); 
    metaState=source.readInt(); 
    size=source.readFloat(); 
    pressure=source.readFloat(); 
    y=source.readFloat(); 
    x=source.readFloat(); 
    action=source.readInt(); 
    eventTime=source.readLong(); 
    downTime=source.readLong(); 
} 
} 

// AIDL

interface IData { 
/** 
* Demonstrates some basic types that you can use as parameters 
* and return values in AIDL. 
*/ 
boolean senMotionEvent(in Data data); 
} 

クライアントアプリケーションのデータを送信します。

@Override 
public boolean onTouchEvent(final MotionEvent event) { 
    return super.onTouchEvent(event); 

    Intent serviceIntent=new Intent(); 
    serviceIntent.setComponent(new ComponentName("XX.XXX.XXX","XX.XXX.XXX.service")); 
    this.bindService(serviceIntent,new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      IData iData= IData.Stub.asInterface(service); 

      Data data= new Data(); 
      data.downTime=event.getDownTime(); 
      data.eventTime=event.getEventTime(); 
      data.action=event.getAction(); 
      data.size=event.getSize(); 
      data.metaState=event.getMetaState(); 
      data.yPrecision=event.getYPrecision(); 
      data.xPrecision=event.getXPrecision(); 
      data.x=event.getX(); 
      data.y=event.getY(); 
      data.edgeFlags=event.getEdgeFlags(); 
      data.deviceId=event.getDeviceId(); 
      data.pressure=event.getPressure(); 
      try { 
       boolean isSuccess= iData.senMotionEvent(data); 
       Log.d("sendEvent","send motionevent result:"+isSuccess); 
      }catch (Exception e){ 
       e.printStackTrace(); 

      } 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      LogUtils.debug("serviceConnection is not connected."); 

     } 
    },Context.BIND_AUTO_CREATE); 
    } 

最後に、あなたはサービスアプリでメッセージを取得する必要があります。

public class IDataService extends Service { 
public class IDataBinder extends IData.Stub { 
    private Context mContext; 
    public IDataBinder(Context context){ 
     this.mContext=context; 
    } 

    boolean senMotionEvent(Data data){ 
     //add operation code of services. 
     return true; 
    } 

    /** 
    * Cast an IBinder object into an Aidl interface, 
    * generating a proxy if needed. 
    */ 
    public static IData asInterface(android.os.IBinder obj) { 
     return IData.Stub.asInterface(obj); 
    } 
} 

IDataBinder iDataBinder=new IDataBinder(this); 

@Override 
public void onCreate() { 
    super.onCreate(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return super.onStartCommand(intent, flags, startId); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return iDataBinder; 
} 

@Override 
public boolean onUnbind(Intent intent) { 
    return super.onUnbind(intent); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
} 
} 

完了です。

+0

ありがとうございました。 このソリューションはroot権限なしで動作しますか? –

+0

必要ありません。これはすべてです。アイルは、アンドロイド間の標準的な通信プロセスです。 – amiko

+0

こんにちは、 あなたの答えをありがとう。 サンプルコードに問題があります。 IMessageAIDLとは何ですか? –

関連する問題