Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Buildog
40 / 40 / 2
Регистрация: 29.04.2012
Сообщений: 185
#1

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

23.12.2014, 18:47. Просмотров 421. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Связывание виджета на рабочем столе и CallLog (Программирование Android):

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

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

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

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

Зависает на рабочем столе - Windows 7
Добрый вечер. При каждом запуске компьютер зависает на рабочем столе минут на 5. Запускаю программу/диспетчер задач/захожу в мой компьютер...

Иконки на рабочем столе - Windows 7
Вот такая беда случалась у одного из пользователей в удаленном регионе, есть некоторые затруднения с экспериментами на нем, может кто в...

1
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 403
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
Привет! Вот еще темы с ответами:

Рисование на рабочем столе - C++ Qt
Привет. Мне нужно вывести текст на рабочем столе пробовал так: qApp-&gt;desktop()-&gt;paintEngine()-&gt;painter()-&gt;drawText(QRect(5, 5, 100,...

Ярлыки на рабочем столе - Windows 7
Всем доброго дня суток! У меня очень неприятная и не понятная проблема: На рабочем столе были папки содержащие файлы т.е. папки были...

Баннер на рабочем столе. - Удаление вирусов
&quot;Спасибо за размещение рекламного модуля... ... Для избавления от модуля: пополните счет абонента Бинайн через терминал...

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


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

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

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