Android Market対応自作アプリをapktoolでPlayストアに対応させる

2012年3月8日 by
カテゴリ: Android, 開発のこと 

昨日 Android Market が Google play とやらに統合された影響で URL が変わったんだよ!

具体的に言うと

https://market.android.com/details?id=jp.r246.twicca

が、

https://play.google.com/store/apps/details?id=jp.r246.twicca

こうなったわけです。古い URL にアクセスするとリダイレクトされちゃう!

別件で調査してた関係で作った https://market.android.com/details のインテントを受け取ったら market://details に変換して再度インテントを飛ばすアプリが反応しなくなっちゃったよ?

左が「market.android.com」を受け取った様子。右が「play.google.com」を受け取った様子。

MarketRedirector1MarketRedirector2

余計なことすんな Google !!

Tweet ボタンを押してみんなに教えて上げようとしても Play ストアになってない人はマーケットアプリで開けないだろ!!

よろしいならば対応だ。

元のファイルはこれ(署名してないので端末にインストールは出来ません)

http://dl.dropbox.com/u/6407977/MarketRedirector/MarketRedirector.apk

んで、apktool d MarketRedirector.apk MarketRedirector とかしてバラします。

今回弄るのは AndroidManifest.xml だけです。

<?xml version="1.0" encoding="utf-8"?>
<manifest android:versionCode="1" android:versionName="1.0" package="jp8796.marketredirector"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-sdk android:minSdkVersion="10" />
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <activity android:label="@string/app_name" android:name=".MarketRedirectorActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="http" android:host="market.android.com" android:pathPrefix="/details" />
                <data android:scheme="https" android:host="market.android.com" android:pathPrefix="/details" />
            </intent-filter>
        </activity>
    </application>
</manifest>

これを

<?xml version="1.0" encoding="utf-8"?>
<manifest android:versionCode="1" android:versionName="1.0" package="jp8796.marketredirector"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-sdk android:minSdkVersion="4" />
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <activity android:label="@string/app_name" android:name=".MarketRedirectorActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="http" android:host="market.android.com" android:pathPrefix="/details" />
                <data android:scheme="https" android:host="market.android.com" android:pathPrefix="/details" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="http" android:host="play.google.com" android:pathPrefix="/store" />
                <data android:scheme="https" android:host="play.google.com" android:pathPrefix="/store" />
            </intent-filter>
        </activity>
    </application>
</manifest>

こう。

intent-filter を追加してるだけでプログラム部分は一切弄ってません。

理屈としては反応する URL を増やしたよ!っておはなしです。

あ、元のアプリが minSdkVersion=10 で作っちゃたので 4 に書き換えてますがこれで Android 1.6 でも動くのかな?みたいな。

んで、 apktool b MarketRedirector とかして組み立てて dist の中に MarketRedirector.apk ができましたとさ。インストールしたければ適当に署名してくださいまし。

ね、簡単でしょ?

ちなみにプログラム部分のソースはこんなん。

public class MarketRedirectorActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        if(Intent.ACTION_VIEW.equals(getIntent().getAction())){
        	Uri uri = getIntent().getData();
	    	String url = "market://details?id=" + uri.getQueryParameter("id");
	    	uri = Uri.parse(url);
	    	Intent i = new Intent(Intent.ACTION_VIEW,uri);
	    	startActivity(i); 
        }
        finish();
    }
}

検証用なのでエラー処理とか一切考慮していないのですが気にしないでください。

コメント

Comments are closed.