Opera Bridge をつくってみる

標準ブラウザの該当intent-filter

標準ブラウザへのインテント渡しには、複数の形式がある。

      <intent-filter >
        <action  android:name="android.intent.action.VIEW" >
        </action>
        <category  android:name="android.intent.category.DEFAULT" >
        </category>
        <category  android:name="android.intent.category.BROWSABLE" >
        </category>
        <data  android:scheme="http" >
        </data>
        <data  android:scheme="https" >
        </data>
        <data  android:scheme="about" >
        </data>
      </intent-filter>
      <intent-filter >
        <action  android:name="android.intent.action.VIEW" >
        </action>
        <category  android:name="android.intent.category.BROWSABLE" >
        </category>
        <category  android:name="android.intent.category.DEFAULT" >
        </category>
        <data  android:scheme="http" >
        </data>
        <data  android:scheme="https" >
        </data>
        <data  android:scheme="inline" >
        </data>
        <data  android:mimeType="text/html" >
        </data>
        <data  android:mimeType="text/plain" >
        </data>
        <data  android:mimeType="application/xhtml+xml" >
        </data>
        <data  android:mimeType="application/vnd.wap.xhtml+xml" >
        </data>
      </intent-filter>
      <intent-filter >
        <action  android:name="android.intent.action.MAIN" >
        </action>
        <category  android:name="android.intent.category.DEFAULT" >
        </category>
        <category  android:name="android.intent.category.LAUNCHER" >
        </category>
        <category  android:name="android.intent.category.BROWSABLE" >
        </category>
      </intent-filter>
      <intent-filter >
        <action  android:name="android.intent.action.WEB_SEARCH" >
        </action>
        <category  android:name="android.intent.category.DEFAULT" >
        </category>
        <category  android:name="android.intent.category.BROWSABLE" >
        </category>
        <data  android:scheme="" >
        </data>
        <data  android:scheme="http" >
        </data>
        <data  android:scheme="https" >
        </data>
      </intent-filter>
      <intent-filter >
        <action  android:name="android.intent.action.MEDIA_SEARCH" >
        </action>
        <category  android:name="android.intent.category.DEFAULT" >
        </category>
      </intent-filter>
      <intent-filter >
        <action  android:name="android.intent.action.SEARCH" >
        </action>
        <category  android:name="android.intent.category.DEFAULT" >
        </category>
      </intent-filter>

Opera Miniの該当intent-filter

スキームを operamini にしているので、http/https には反応しない。

      <intent-filter >
        <action  android:name="android.intent.action.VIEW" >
        </action>
        <category  android:name="android.intent.category.BROWSABLE" >
        </category>
        <category  android:name="android.intent.category.DEFAULT" >
        </category>
        <data  android:scheme="operamini" >
        </data>
      </intent-filter>

OperaBridgeの該当intent-filter

標準ブラウザと比べて1つの形式しか受け入れない。

      <intent-filter >
        <action  android:name="android.intent.action.VIEW" >
        </action>
        <category  android:name="android.intent.category.DEFAULT" >
        </category>
        <category  android:name="android.intent.category.BROWSABLE" >
        </category>
        <data  android:scheme="http" >
        </data>
        <data  android:scheme="https" >
        </data>
        <data  android:scheme="about" >
        </data>
      </intent-filter>

OperaBridgeを利用したときのログ

I/ActivityManager(   82): Starting activity: Intent { act=android.intent.action.VIEW dat=http://www.dailymotion.com/ cmp=android/com.android.internal.app.ResolverActivity }
I/ActivityManager(   82): Starting activity: Intent { act=android.intent.action.VIEW dat=http://www.dailymotion.com/ flg=0x3800000 cmp=jp.androdev.operabridge/.MainActivity }
I/ActivityManager(   82): Start proc jp.androdev.operabridge for activity jp.androdev.operabridge/.MainActivity: pid=26751 uid=10146 gids={1015}
I/ActivityManager(   82): Starting activity: Intent { act=android.intent.action.VIEW dat=http://www.dailymotion.com/ flg=0x3800000 cmp=jp.androdev.operabridge/.MainActivity }
I/ActivityManager(   82): Starting activity: Intent { act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE,android.intent.category.DEFAULT] dat=operamini:http://www.dailymotion.com/ cmp=com.opera.mini.android/.Browser }

よって、OperaBridgeからOperaMiniへ渡すときの形式は、

act=android.intent.action.VIEW
cat=[android.intent.category.BROWSABLE,android.intent.category.DEFAULT]
dat=operamini:http://www.dailymotion.com/ cmp=com.opera.mini.android/.Browser

となっているので、アプリ内部から同様に発行すればいい。

コード

AndroidManifest.xmlの該当インテントフィルターは同じ。

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 渡されたURLデータの取得
        String url = getIntent().getDataString();
        if (url == null) url = "http://vids.myspace.com/"; 
       
        // スキームを追加
        url = "operamini:" + url;

        // インテント発行
        Intent it = new Intent();
        it.setAction(Intent.ACTION_VIEW);
        it.setData(Uri.parse(url));
        startActivity(it);

        finish();
    }

これで、Operamini が起動できる。