Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Buildog
40 / 40 / 5
Регистрация: 29.04.2012
Сообщений: 185
1

Связывание виджета на рабочем столе и CallLog

23.12.2014, 18:47. Просмотров 495. Ответов 1

Доброго времени суток, форумчане, уже который день мучаюсь с созданием виджета под андройд. Задание примерно такое, вывести информацию о звонках в виджет на рабочем столе. В интернете нашел как выводить информацию в виджет списком с помощью адаптеров, как это делалось в обычном приложении.

Сейчас есть вот такой код, где закомментированное - мои попытки вывести информацию из CallLog, но неудачные...

MyFactory.java
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package com.example.kasnitsij.rgr;
 
import java.io.Externalizable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
 
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService.RemoteViewsFactory;
 
 
public class MyFactory implements RemoteViewsFactory
{
    ArrayList<String> data;
    //ContentResolver cr;
    Context context;
    //Cursor c;
    SimpleDateFormat sdf;
    int widgetID;
    //Uri contentUri = CallLog.Calls.CONTENT_URI;
    /*String[] projection = new String[]{
            CallLog.Calls._ID,
            CallLog.Calls.NUMBER,
            CallLog.Calls.TYPE
            };*/
    
    MyFactory(Context ctx, Intent intent) 
    {
        context = ctx;
        sdf = new SimpleDateFormat("HH:mm:ss");
        widgetID = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID);
        /*this.context = ctx;
        cr = ctx.getContentResolver();*/
      }
 
    @Override
    public void onCreate() 
    {
        //c = cr.query(CallLog.Calls.CONTENT_URI, projection, null, null, null);
        data = new ArrayList<String>();
        // TODO Auto-generated method stub
        
    }
 
    @Override
    public void onDataSetChanged() 
    {
        /*Cursor cursor;
        ContentResolver cr = context.getContentResolver();
        cursor = cr.query(contentUri, projection, null, null, null);
        /*while (cursor.moveToNext())
        {
            //int id = cursor.getInt(cursor.getColumnIndexOrThrow(CallLog.Calls._ID));
            String number = cursor.getString(cursor.getColumnIndexOrThrow(CallLog.Calls.NUMBER));
            //String type = cursor.getString(cursor.getColumnIndexOrThrow(CallLog.Calls.TYPE));
 
            //data.add(String.valueOf(id));
            data.add(number);
            //data.add(type);
        }*/
        data.clear();
        data.add(sdf.format(new Date(System.currentTimeMillis())));
        data.add(String.valueOf(hashCode()));
        data.add(String.valueOf(widgetID));
        for (int i = 3; i < 15; i++) 
        {
          data.add("Item " + i);
        }
      }
 
    @Override
    public void onDestroy() 
    {
        //c.close();
    }
 
    @Override
    public int getCount() 
    {
        return data.size();
        /*if (c != null)
            return c.getCount();
        else 
            return 0;*/
    }
 
    @Override
    public RemoteViews getViewAt(int position) 
    {
        /*c.moveToPosition(position);
        int idIdx = c.getColumnIndex(CallLog.Calls._ID);
        String id = c.getString(idIdx);
        Uri uri = Uri.withAppendedPath(CallLog.Calls.CONTENT_URI, "" + id);
        RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.item);
        rv.setImageViewUri(R.id.tvItemText, uri);
        Intent fillInIntent = new Intent();
        fillInIntent.setData(uri);
        rv.setOnClickFillInIntent(R.id.tvItemText, fillInIntent);
        return rv;*/
        RemoteViews rView = new RemoteViews(context.getPackageName(),
                R.layout.item);
            rView.setTextViewText(R.id.tvItemText, data.get(position));
            Intent clickIntent = new Intent();
            clickIntent.putExtra(MyProvider.ITEM_POSITION, position);
            rView.setOnClickFillInIntent(R.id.tvItemText, clickIntent);
 
            return rView;
      }
 
    @Override
    public RemoteViews getLoadingView() 
    {
        return null;
    }
 
    @Override
    public int getViewTypeCount() 
    {
        return 1;
    }
 
    @Override
    public long getItemId(int position) 
    {
        return position;
        /*if (c != null)
            return c.getInt(c.getColumnIndex(CallLog.Calls._ID));
        else
            return position;*/
    }
 
    @Override
    public boolean hasStableIds() 
    {
        return true;
    }
    
}

А это класс MyProvider.java
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package com.example.kasnitsij.rgr;
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.widget.RemoteViews;
import android.widget.Toast;
 
public class MyProvider extends AppWidgetProvider
{
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
    final String ACTION_ON_CLICK = "rgr.itemonclick";
    final static String ITEM_POSITION = "item_position";
    
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) 
    {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        for (int i : appWidgetIds) 
        {
          updateWidget(context, appWidgetManager, i);
        }
    }
    
    void updateWidget(Context context, AppWidgetManager appWidgetManager,
              int appWidgetId) 
    {
        RemoteViews rv = new RemoteViews(context.getPackageName(),
                R.layout.widget);
 
            setUpdateTV(rv, context, appWidgetId);
 
            setList(rv, context, appWidgetId);
 
            setListClick(rv, context, appWidgetId);
 
            appWidgetManager.updateAppWidget(appWidgetId, rv);
            appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId,
                R.id.lvList);
          }
 
          void setUpdateTV(RemoteViews rv, Context context, int appWidgetId) 
          {
            rv.setTextViewText(R.id.tvUpdate,
                sdf.format(new Date(System.currentTimeMillis())));
            Intent updIntent = new Intent(context, MyProvider.class);
            updIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
            updIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,
                new int[] { appWidgetId });
            PendingIntent updPIntent = PendingIntent.getBroadcast(context,
                appWidgetId, updIntent, 0);
            rv.setOnClickPendingIntent(R.id.tvUpdate, updPIntent);
          }
 
          void setList(RemoteViews rv, Context context, int appWidgetId) 
          {
              Intent adapter = new Intent(context, MyService.class);
                adapter.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
                Uri data = Uri.parse(adapter.toUri(Intent.URI_INTENT_SCHEME));
                adapter.setData(data);
                rv.setRemoteAdapter(R.id.lvList, adapter);
          }
 
          void setListClick(RemoteViews rv, Context context, int appWidgetId) 
          {
              Intent listClickIntent = new Intent(context, MyProvider.class);
                listClickIntent.setAction(ACTION_ON_CLICK);
                PendingIntent listClickPIntent = PendingIntent.getBroadcast(context, 0,
                    listClickIntent, 0);
                rv.setPendingIntentTemplate(R.id.lvList, listClickPIntent);
          }
          
          
          @Override
        public void onReceive(Context context, Intent intent) 
          {
                super.onReceive(context, intent);
                if (intent.getAction().equalsIgnoreCase(ACTION_ON_CLICK)) 
                {
                  int itemPos = intent.getIntExtra(ITEM_POSITION, -1);
                  if (itemPos != -1) 
                  {
                    Toast.makeText(context, "Clicked on item " + itemPos,
                        Toast.LENGTH_SHORT).show();
                  }
                }
          }
}


Ещё есть класс MyService.java но там буквально пару строк для создания адаптера.

P.S. Ещё обидно, что совсем не получается отладить виджеты... точки останова не работают и все плохо в общем...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2014, 18:47
Ответы с готовыми решениями:

Ярлык на рабочем столе
Создаю ярлык таким способом: ShortcutIconResource icon =...

Можно ли запускать мобильную игру на рабочем столе?
Только что задумался, почему нет мобильных игр, которые можно запустить и...

Программы не запускаются на рабочем столе, ко всем ярлыкам на рабочем столе добавляется приставка .Ink
Помогите пожалуйста, использовал рекомендованную вами программу CureIT (нашел...

Рисовалка на рабочем столе
Вот написал программку, что бы рисовать в форме, а теперь мне нужно сделать...

Реклама на рабочем столе
Доброго времени суток! Похожего поста не нашел и решил открыть новую тему....

1
Gabberr
103 / 103 / 19
Регистрация: 13.10.2009
Сообщений: 404
24.12.2014, 10:26 2
Приведу пример с активити:
в манифесте
XML
1
    <uses-permission android:name="android.permission.READ_CALL_LOG"/>
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class MainActivity extends Activity {
    TextView textView = null;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textview_call);
        getCallDetails();
    }
 
    private void getCallDetails() {
 
        StringBuffer sb = new StringBuffer();
        Cursor managedCursor = managedQuery(CallLog.Calls.CONTENT_URI, null,
                null, null, null);
        int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
        int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
        int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
        int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
        sb.append("Call Log :");
        while (managedCursor.moveToNext()) {
            String phNumber = managedCursor.getString(number);
            String callType = managedCursor.getString(type);
            String callDate = managedCursor.getString(date);
            Date callDayTime = new Date(Long.valueOf(callDate));
            String callDuration = managedCursor.getString(duration);
            String dir = null;
            int dircode = Integer.parseInt(callType);
            switch (dircode) {
                case CallLog.Calls.OUTGOING_TYPE:
                    dir = "OUTGOING";
                    break;
 
                case CallLog.Calls.INCOMING_TYPE:
                    dir = "INCOMING";
                    break;
 
                case CallLog.Calls.MISSED_TYPE:
                    dir = "MISSED";
                    break;
            }
            sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- "
                    + dir + " \nCall Date:--- " + callDayTime
                    + " \nCall duration in sec :--- " + callDuration);
            sb.append("\n----------------------------------");
        }
        //managedCursor.close();
        textView.setText(sb);
    }
 
}
лаяут :

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
 
    <ScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
 
        <TextView
            android:id="@+id/textview_call"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true" />
    </ScrollView>
 
</RelativeLayout>
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2014, 10:26

Значки на Рабочем столе
Здравствуйте! Моя проблема такова, что я даже не знаю, к какому разделу её...

На рабочем столе глюк
В Левом правом углу не могу нечего переместить туда пустое место и когда туда...

Иконки на рабочем столе
И так.... Я поставил чтоб значки на рабочем столе не отображались, но вот в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru