顯示具有 shortcut 標籤的文章。 顯示所有文章
顯示具有 shortcut 標籤的文章。 顯示所有文章

2010年10月27日 星期三

[Android] 如何在桌面建立捷徑圖示 (2.接受Intent.ACTION_CREATE_SHORTCUT動作)



在上一篇 [Android] 如何在桌面建立捷徑圖示 (1.Launcher 的 BroadcastReceiver)文章介紹透過Launcher的權限在桌面建立捷徑 , 但其實我們還可以在桌面的
空白處長按不放 , 系統即會詢問我們是否要在桌面加入物件 , 如下圖





在這邊可以選擇要加入的物件類別 , 如果說我們想要替我們的程式產生捷徑



使用系統內建的功能 , 這邊許多城市都可以產生出捷徑 , 而我們的程式會被系統放在
應用程式下點選之後桌面就會出現程式捷徑了 ,  可是這樣產生的捷徑固定動作就是前
往該應用程式 , 如果我們想透過長按的方式呼叫出清單並自訂我們捷徑的動作的話
該如何實作呢?


首先我們需要在 AndroidManifest.xml 添加屬性 , 這邊多加了一行 
<action android:name="android.intent.action.CREATE_SHORTCUT"/>










          

現在可以看到ShortcutTest 出現在清單上了 


接下來就是程式碼的部分


import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


public class ShortcutTest extends Activity 
{
    @Override
    
    public void onCreate(Bundle savedInstanceState)
    {        
     super.onCreate(savedInstanceState);

        // 如果intent的動作是被要求建立一個捷徑 , 那麼進入判斷式子建立捷徑 , 然後終止Activity

        if (Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction()))
        {
            setupShortcut();
            finish();
            return;
        }
     
     setContentView(R.layout.main);     
     TextView Info = (TextView) findViewById(R.id.TextView);        
        Info.setText("請回到桌面 , 在空白處長按 , 選取建立捷徑");
    
    }
    
    private void setupShortcut() 
 {
     Intent shortcutIntent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
     //也可以使用 Intent.ACTION_MAIN
     
     shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "Shortcut");
      shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,Intent.ShortcutIconResource.fromContext(this,R.drawable.icon));
        
     Intent intent = new Intent(); 
        intent.setClassName(this, this.getClass().getName());
        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
       
        setResult(RESULT_OK, shortcutIntent);
  /*
   * setResult (int resultCode, Intent data)
   * Call this to set the result that your activity will return to its caller.
           Parameters
           resultCode: The result code to propagate back to the originating activity, often    RESULT_CANCELED or RESULT_OK
           data:       The data to propagate back to the originating activity.
           See Also
           RESULT_CANCELED
           RESULT_OK
           RESULT_FIRST_USER
           setResult(int)
   * */
 }
    
}

當我們執行這個程式的時候會出現這樣的畫面



(*)由於我們的程式碼裡面有一個是否為 Intent.ACTION_CREATE_SHORTCUT 
動作的判斷式所以直接從應用程式中執行的話只會出現上面的提示
沒有任何產生捷徑的動作 , 所以必須從剛剛的清單選取
ShortcutTest此時系統會宣告一個android.intent.action.CREATE_SHORTCUT
的Intent並呼叫 
startActivityForResult(Intent intent, int requestCode) 

來等候ShortcutTest 的回應這

個時候
ShortcutTest 接獲Intent.ACTION_CREATE_SHORTCUT

的Intent


就會呼叫判斷式中的setupShortcut() , 最後再以SetResult(int)回傳資訊給系統

告知要建立捷徑




之後桌面就會成功的出現我們要的捷徑了




打星號的部份雖然可以成功執行 , 但是細節部分是我的推測 , 有興趣的人可以再試試
在清單中要加入捷徑時 , 在應用程式底下的apps , 會直接的產生捷徑 , 而和應用程
式同
一層Level的物件, 該Level 中
共同點都是會先執行該程式
 , 但並不是每個都可以
成功產生捷徑
ex. 書籤,直接傳訊,直接撥號 
Google 定位倒是可以。

所以
ShortcutTest
出現在該Level 也就會
被執行一次 , 所以接到 
Intent.ACTION_CREATE_SHORTCUT後 , 再完成捷徑的回傳程式就自finish() , 好讓
畫面跳回桌面 , 這邊都是自己的實驗和推測 , 有錯誤的話歡迎討論。



2010年10月26日 星期二

[Android] 如何在桌面建立捷徑圖示 (1.Launcher 的 BroadcastReceiver)



這幾天在找關於建立捷徑的資料 , 從中歸類出兩種方法 , 首先是第一種透過Launcher
的BroadcastReceiver 的方法建立快捷 , Launcher 為了讓其他應用程式能建立自己的捷
所以就註冊了一個BroadcastReceiver 專門接收其他應用程式發出的建立捷徑訊息
下面是Launcher的AndroidManifest.xml文件中Install-ShortcutReceiver的註冊訊息


 

 
 


接下來我們就要宣告並發送一個用來告知Launcher要建立桌面捷徑的Intent , 不過首先我
從Launcher那取得權限 , 權限名稱宣告如下:

private static final String INSTALL_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT";



接著我們需要宣告一個Intent , 用他來告知Launcher建立桌面捷徑 , 而對於這一個用來
Creates a shortcut 的Intent來說 , 他必須包含三個資訊 , 下面是Android Reference


Activity Action: Creates a shortcut.
Input: Nothing.
Output: An Intent representing the shortcut. The intent must contain three extras: 
SHORTCUT_INTENT (value: Intent), 
SHORTCUT_NAME (value: String),
SHORTCUT_ICON (value: Bitmap) or SHORTCUT_ICON_RESOURCE (value: ShortcutIconResource).


程式碼實作如下:

public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Intent shortcutIntent = new Intent(INSTALL_SHORTCUT);
        
        // 如果宣告的Intent是用來建立桌面捷徑的話
        // 必須在Intent中加入名稱 , 圖示 , 要執行的動作
        // 所以此時 shortcutIntent.putExtra 分別載入
        // 上面所需要的三個資訊          
       
     
     shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME,getString(R.string.app_name));
        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,Intent.ShortcutIconResource.fromContext(this,R.drawable.logo));
        //可以用 SHORTCUT_ICON (value: Bitmap)代替
        
        shortcutIntent.putExtra("duplicate", false);
        // 如果桌面上已經存在了之前建立的捷徑
        // 那麼參數false代表不能再建立相同的捷徑
        // 預設為true , 代表允許重複建立捷徑
        // 網路上有人使用 putExtra(EXTRA_SHORTCUT_DUPLICATE, false);
        // 我是使用Android 2.2的版本 , EXTRA_SHORTCUT_DUPLICATE 似乎已經被移除了
        // 所以使用 "duplicate" 代替
        
        
        Intent TaskIntent = new Intent();
        // 這邊宣告的Intent代表要執行動作
        
        TaskIntent.setComponent(new ComponentName(this.getPackageName(),".ShortcutTest"));        
        // 執行主程式
        
        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT,TaskIntent);
        sendBroadcast(shortcutIntent);
        // 通知Launcher
    }


另外也別忘了在AndroidManifest.xml要加上uses-permission的標籤




成功之後就會出現以下的結果




                                當成功產生捷徑的時候 , 會有一個Toast訊息





接著可以看到桌面多出了一個Shortcut的捷徑!!!!


點擊捷徑就可以執行我們的主程式了 , 另外如果想把捷徑當作快速撥號的話 , 只要稍作修改如下
Intent TaskIntent = new Intent(Intent.ACTION_CALL,Uri.parse("tel://119"));
//撥號動作 , 打119


相關文章:
[Android] 如何在桌面建立捷徑圖示 (2.接受Intent.ACTION_CREATE_SHORTCUT動作)

Google Analytics