让LED47R5200开机自动播放电视

  家里买了个康佳的LED47R5200PDE的Android电视,反应各种慢,操作各种不流畅。太郁闷了,感觉完全是被康佳和京东给坑了。打电话各种反应,结果是各种不理睬。特别是康佳,严重鄙视之。最让人讨厌的是每次开机都要进入Android主页,而不是直接播放电视。心中那个郁闷啊。这让开机时需要两个遥控器操作。

  算了,求人不如求己,我自己写个开机自动播放电视的应用。

 下载地址和更新代码见:http://blog.csdn.net/enlangs/article/details/17280671

话不多说,下面开始。

==========================================================================================================

下载一个launch,反编译之。

1、首先查看AndroidManifest.xml文件,找到

       <activity android:theme="@style/Theme" android:name="com.cyanogenmod.trebuchet.Launcher" android:clearTaskOnLaunch="true" android:stateNotNeeded="true" android:launchMode="singleTask" android:windowSoftInputMode="adjustPan">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.MONKEY" />
            </intent-filter>
        </activity>

2、使用UltraEdit查看com.cyanogenmod.trebuchet.Launcher的代码(Launcher.smali),呼出函数列表,找到:

.method private startTVSystem()V
    .locals 7

    .prologue
    .line 884
    const-string v4, "activity"

    invoke-virtual {p0, v4}, Lcom/cyanogenmod/trebuchet/Launcher;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Landroid/app/ActivityManager;

    .line 885
    .local v0, am:Landroid/app/ActivityManager;
    const/4 v4, 0x2

    invoke-virtual {v0, v4}, Landroid/app/ActivityManager;->getRunningTasks(I)Ljava/util/List;

    move-result-object v4

    const/4 v5, 0x0

    invoke-interface {v4, v5}, Ljava/util/List;->get(I)Ljava/lang/Object;

    move-result-object v4

    check-cast v4, Landroid/app/ActivityManager$RunningTaskInfo;

    iget-object v1, v4, Landroid/app/ActivityManager$RunningTaskInfo;->topActivity:Landroid/content/ComponentName;

    .line 886
    .local v1, cn:Landroid/content/ComponentName;
    const-string v4, "Launcher"

    new-instance v5, Ljava/lang/StringBuilder;

    const-string v6, "the top activity=========="

    invoke-direct {v5, v6}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    invoke-virtual {v1}, Landroid/content/ComponentName;->getPackageName()Ljava/lang/String;

    move-result-object v6

    invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v5

    invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v5

    invoke-static {v4, v5}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 887
    invoke-virtual {v1}, Landroid/content/ComponentName;->getPackageName()Ljava/lang/String;

    move-result-object v4

    const-string v5, "com.konka.tvsettings"

    invoke-virtual {v4, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v4

    if-eqz v4, :cond_0

    .line 888
    const-string v4, "Launcher"

    const-string v5, "the TV app is already on the top task list"

    invoke-static {v4, v5}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I

    .line 904
    :goto_0
    return-void

    .line 891
    :cond_0
    invoke-virtual {v1}, Landroid/content/ComponentName;->getPackageName()Ljava/lang/String;

    move-result-object v4

    const-string v5, "com.konka.avenger"

    invoke-virtual {v4, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v4

    if-eqz v4, :cond_1

    .line 892
    invoke-virtual {p0}, Lcom/cyanogenmod/trebuchet/Launcher;->closeTVWindow()V

    .line 894
    const-wide/16 v4, 0x3e8

    :try_start_0
    invoke-static {v4, v5}, Ljava/lang/Thread;->sleep(J)V
    :try_end_0
    .catch Ljava/lang/InterruptedException; {:try_start_0 .. :try_end_0} :catch_0

    .line 900
    :cond_1
    :goto_1
    new-instance v3, Landroid/content/Intent;

    const-string v4, "com.konka.tvsettings.intent.action.RootActivity"

    invoke-direct {v3, v4}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

    .line 901
    .local v3, intentActivity:Landroid/content/Intent;
    const/high16 v4, 0x1020

    invoke-virtual {v3, v4}, Landroid/content/Intent;->addFlags(I)Landroid/content/Intent;

    .line 903
    invoke-virtual {p0}, Lcom/cyanogenmod/trebuchet/Launcher;->getApplicationContext()Landroid/content/Context;

    move-result-object v4

    invoke-virtual {v4, v3}, Landroid/content/Context;->startActivity(Landroid/content/Intent;)V

    goto :goto_0

    .line 895
    .end local v3           #intentActivity:Landroid/content/Intent;
    :catch_0
    move-exception v2

    .line 896
    .local v2, e:Ljava/lang/InterruptedException;
    invoke-virtual {v2}, Ljava/lang/InterruptedException;->printStackTrace()V

    goto :goto_1
.end method

找到:

   new-instance v3, Landroid/content/Intent;

    const-string v4, "com.konka.tvsettings.intent.action.RootActivity"

    invoke-direct {v3, v4}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

    .line 901
    .local v3, intentActivity:Landroid/content/Intent;
    const/high16 v4, 0x1020

    invoke-virtual {v3, v4}, Landroid/content/Intent;->addFlags(I)Landroid/content/Intent;

    .line 903
    invoke-virtual {p0}, Lcom/cyanogenmod/trebuchet/Launcher;->getApplicationContext()Landroid/content/Context;

    move-result-object v4

    invoke-virtual {v4, v3}, Landroid/content/Context;->startActivity(Landroid/content/Intent;)V

看看这儿:

    invoke-direct {v3, v4}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V
//看Intent的源码
3439    /**
3440     * Create an intent with a given action.  All other fields (data, type,
3441     * class) are null.  Note that the action <em>must</em> be in a
3442     * namespace because Intents are used globally in the system -- for
3443     * example the system VIEW action is android.intent.action.VIEW; an
3444     * application's custom action would be something like
3445     * com.google.app.myapp.CUSTOM_ACTION.
3446     *
3447     * @param action The Intent action, such as ACTION_VIEW.
3448     */
3449    public Intent(String action) {
3450        setAction(action);
3451    }

3、把这段代码,用java表示出来,如下所示:

    /**
     * 启动TV。
     */
    public void startTV()
    {
        //invoke-direct {v3, v4}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V
        Intent it = new Intent("com.konka.tvsettings.intent.action.RootActivity");
        it.addFlags(0x1020);
        this.startActivity(it);
    }

4、写个APK,测试下。测试代码如下

package com.cnblogs.jevan.autostarttv;

import com.cnblogs.jevan.autoplaytv.R;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
 * 讨厌每次开机都要点击下遥控器的确认键才能播放电视,所以想自己写个应用程序。让塔开机每次都自动进入电视节目。
 * @author jevan
 * @version (1.0 at 2013-6-14) 测试接口。
 */
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        ((Button)findViewById(R.id.button1)).setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                startTV();
            }
        });
    }
    /**
     * 启动TV。
     */
    public void startTV()
    {
        //invoke-direct {v3, v4}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V
        Intent it = new Intent("com.konka.tvsettings.intent.action.RootActivity");
        it.addFlags(0x1020);
        this.startActivity(it);
    }
    
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

5、测试OK,效果正常。增加开机自动运行的功能。

 下载地址和更新代码见:http://blog.csdn.net/enlangs/article/details/17280671

原文地址:https://www.cnblogs.com/jevan/p/3137171.html