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 が起動できる。