41 / 41 / 5
Регистрация: 29.04.2012
Сообщений: 185

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

23.12.2014, 18:47. Показов 1118. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.12.2014, 18:47
Ответы с готовыми решениями:

Ярлык на рабочем столе
Создаю ярлык таким способом: ShortcutIconResource icon = Intent.ShortcutIconResource.fromContext(this, R.drawable.ic_launcher); ...

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

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

1
 Аватар для Gabberr
105 / 105 / 19
Регистрация: 13.10.2009
Сообщений: 406
24.12.2014, 10:26
Приведу пример с активити:
в манифесте
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2014, 10:26
Помогаю со студенческими работами здесь

Файл на рабочем столе :)
Пытаюсь создать файл на рабочем столе, прежде проверяю есть ли он там :) необходимые функции bool FileExists(const char *fname) { ...

Браузер на рабочем столе
Доброго времени суток, слышал о active desctop на всех системах win начиная с win 95 по 8, он поддерживает html и css вместе с js тк...

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

IP адрес на рабочем столе
Посоветуйте плиз программу которая бы отображала ip адрес и имя пк на рабочем столе, попробовал BgInfo но её нужно обновлять вручную, очень...

Надпись на рабочем столе
Как убрать надпись с рабочего стола в Windows 8.1 (находится в нижнем правом углу)?


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

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

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru