質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Android

    6513questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3695questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • Xamarin

    498questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Xamarin.androidで、AIDLファイルを扱う方法について

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,036

tomo117722

score 2

Xamarin.androidで、AIDLファイルを扱う方法について質問です。

現在、Javaで作成(AndroidStudio)したapk上のサービスと
Xamarin.androidで作成したapk上のサービス間でデータの
やり取りをさせようとしています。
(Java側のサービスにXamarin側のサービスからバインドして
ホスト側サービスのメソッドをコールする。)

自作クラスをやり取りさせるためにJava側でParcelableを継承
したIF用のクラスおよびAIDLファイルを作成しました。

Javaで作成したプロジェクト同士であれば、上記ファイルを
クライアント側のプロジェクトにコピーして自作クラス型の
データを受け取る事はできたのですが、
Xamarin.androidでは、どの様にすれば実現できますでしょうか?

当方Java、Xamarinとも経験が無く、完全に行き詰っています。
何とかご教授を宜しくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

Xamarin.Android で Android の Service を作る・使う方法は、

に情報があります。

また、サンプルプログラムが、

にあります。

Android Service の .aidl を使う方法については、

このあたりが参考になるかと思います。

最後に、Android-Java の Parcelable の実装方法は、Xamarin.Android では以下のようになります。

サービス周りは複雑なので、まずは .aidl を使わない Android-Java 製の Service に、Xamarin.Android から接続できるかなど、簡単そうなところから試された方が良いと思います。

 2017.2.22 追記

これは、そもそも「デシリアライズ」の仕方がわかってないだけのような気もしますが。
Exceptionは戻そうとしても送信側で詰め込んだ型が見つからないよ。という事だとは思うのですが。。。

その通りでした。一部私も気づかなかったところがあったので追記します。

JavaでParcelableを実装したクラス(Card.javaとします)をシリアライズし、Xamarin.Androidで、IParcelableを実装したクラス(Card.cs)でデシリアライズはできません。Xamarin.Androidはビルド時にmdXXXXXXXX.CardというJavaのクラスを生成しますが、名前空間などが元々のCard.javaと一致しないなど、両者に互換性がありません。
つまりXamarin.AndroidでIPercelableISerializableを実装したクラスは、Javaと相互運用性がありません。

ではどうするかというと、Javaのバインディングライブラリを作成するしかなさそうです。

具体的には、Card.javaをJava側でアプリとは別のJARライブラリとして切り出し(Card.jarとします)、Xamarin.Android側でJavaバインディングプロジェクトを作成して、Card.jarを取り込みます。

このJavaバインディングプロジェクトを参照したアプリプロジェクトであれば、Card.javaをシリアライズしたデータをデシリアライズ可能と思います。

本来なら試してから回答すべきですが、取り急ぎ情報共有のため追記しました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/22 14:19

    早急な回答、ありがとうございます。

    Android-Java製のserviceにXamarin製のアプリからバインドしてMessengerによるデータの送受信までは確認できました。
    一度の要求で複数のデータを送受信するため、msgにPutIntやPutByteArrayにてデータを詰め込んで送信しています。

    また、aidlを使用してホスト側のサービスをバインドする事も何とか
    実装できました。
    (Xamarin側からAndroidStudio側サービスのメソッドをコール)
    但し、使用している型はプリミティブ型?(int、string等)のみ。

    ただ、教えて頂いた参考サイトでも「.javaで作成した自作クラスを
    Xamarin側で書き換えて使用する」ということは行っていないようで、
    「実現できるかどうか?」が判っていない状態です。

    Messengerによるインターフェースで、やりたい機能としては何とか実現できそう。ではあるのですが・・・

    可能であればもう少しお付き合い頂ければと思います。

    キャンセル

  • 2017/02/22 14:58

    > 「.javaで作成した自作クラスを Xamarin側で書き換えて使用する」
    が、「JavaでParcelableを実装したクラスのインスタンスをシリアライズ(永続化)したデータ」が、「Xamarin.Android」でデシリアライズ(復元)できるか?
    という質問ならば、それは「可能」でしょう。
    それはサービスでなくても試せます。Java製のAndroidアプリから暗黙的インテントにParcelableなデータを詰めてstartActivityし、Xamarin製のAndroidアプリでそのインテントを拾うようにIntentFilterを仕掛けて、拾えたらParcelableをデシリアライズしてみればよいかと思います。 - http://qiita.com/ymotongpoo/items/d8a054f6fc93d069cb37

    キャンセル

  • 2017/02/22 19:11

    amay077さま。何度も回答をすみません。。。

    ご指摘のように
    Java製のAndroidアプリからインテントにParcelableなデータを詰めてstartActivityし、Xamarin製のAndroidアプリでそのParcelableをデシリアライズ。やってみましたが以下のExceptionが発生しデシリアライズできません。
    ------------------------------
    Unhandled Exception:
    Android.OS.BadParcelableException: ClassNotFoundException when unmarshalling: com.example.tomo117722.myapplication.IFClass
    -------------------------------

    以下試したソースです
    <Java製のAndroidアプリ>
    -----------------------------------
    ボタン押下時にXamarin側アプリのActivityを起動する
    IFClass sendData = new IFClass(); <--ParcelableをインタフェースしたIF用クラス
    Intent intent = new Intent();
    intent.setClassName("XamarinPackage.XamarinPackage","RecvActivity") ;
    intent.putExtra("testData",sendData);<--ParcelableをインタフェースしたIF用クラス
    startActivity(intent); <--受信用アクティビティは起動できた。
    -----------------------------------

    <Xamarin製アプリ>
    -----------------------------------
    起動されたActivityのOnCreateでIntentからIF用クラスのデータを取得したい
    protected override void OnCreate(Bundle bundle)
    {
    base.OnCreate(bundle);

    var recvTestData1 = this.Intent.GetSerializableExtra("testData"); <--Exception
    var recvTestData2 = this.Intent.GetParcelableExtra("testData"); <--Exception

    var recvTestData3 = this.Intent.GetSerializableExtra("testData") as IFClass; <--JavaのIFクラスを書き直してみた:Exception
    var recvTestData4 = this.Intent.GetParcelableExtra("testData") as IFClass; <--JavaのIFクラスを書き直してみた:Exception
    }
    -----------------------------------

    これは、そもそも「デシリアライズ」の仕方がわかってないだけのような気もしますが。
    Exceptionは戻そうとしても送信側で詰め込んだ型が見つからないよ。という事だとは思うのですが。。。

    キャンセル

  • 2017/02/23 00:21

    > 戻そうとしても送信側で詰め込んだ型が見つからない
    この点について見落としてた点があったので回答に追記しました。

    キャンセル

  • 2017/02/23 18:09

    何度も回答ありがとうございます。

    色々と試しては見ましたが、結論として解決には至っておりません。
    [やってみた事]
    Card.javaをJava側でアプリとは別のJARライブラリとして切り出す。
    ①コマンドラインにて[jar cvf Card.jar Card.java]を実行してCard.jarを作成
    ②androidStudioでjar作成用プロジェクトにCard.javaをコピーしCard.jarを作成
    Xamarin側のバインディングプロジェクトにCard.jarを取り込んで参照(ビルドアクションはEmbeddedJar)。
    ①はそもそもCard.java内のクラスがライブラリに登録されない。(jarの作り方が間違いか。)
    ②ではCard.java内のクラスがライブラリに登録され、Card.java内に記載したクラスを
    使用できるようにはなりましたが、GetParcelableExtraにてExceptionが発生してしまいます。
    ②はjar作成用に別packageでCard.javaクラスをビルドしているため、これも当然?な気はします。

    キャンセル

  • 2017/02/23 18:32

    そうですか、残念です。ちょっと今試す余裕が無いので、時間できたらやってみますね。

    キャンセル

  • 2017/02/23 19:35

    ありがとうございます。
    何度もすみませんでした。

    >ちょっと今試す余裕が無いので、時間できたらやってみますね。
    申し訳ありません。その際は、ぜひご教授ください。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Android

    6513questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3695questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • Xamarin

    498questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。