Prüfen ob Service aktiv ist

Ich schreibe momentan ein Live Wallpaper für Android, mit einer Activity um Infos zum aktuellen Bild darzustellen. Um komfortabel das Live Wallpaper zu aktivieren brauche ich eine Prüfung, ob das auch läuft. WallpaperService ist von Service abgeleitet und damit ist dies kein Problem:

    /* ..... */
	private boolean isMyServiceRunning(String className) {
	    ActivityManager manager = (ActivityManager) getActivity().getSystemService(Context.ACTIVITY_SERVICE);
	    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
	        if (className.equals(service.service.getClassName())) {
	            return true;
	        }
	    }
	    return false;
	}
    /* ..... */

Nun kann bei Bedarf der Wallpaper Picker angezeigt werden:

	if(isMyServiceRunning(MyWallpaperService.class.getName())){
			Log.d(TAG, "active" );
	} else {
			Intent intent = new Intent(Intent.ACTION_SET_WALLPAPER);
			startActivity(Intent.createChooser(intent, getActivity().getString(R.string.title_for_wallpaper_chooser)));
	}

Fin.

Howto – Daydream / Screensaver App erstellen

Ab Android 4.2 – Api Level 17 bietet Android die Möglichkeit mit Daydream einen Screensaver einzurichten. Daydream startet wenn das Gerät
am Netz hängt oder in einer Dockingstation steckt. Daydream kann man in den Systemeinstellungen unter Display -> Daydream aktivieren.
Ich beschreibe an dieser Stelle wie man einen einfachen DayDream Service implementiert der bei Aktivierung ein Video abspielt, damit alles schön übersichtlich bleibt.

Daydream wird als Service implementiert der von android.service.dreams.DreamService erbt, man hat den vollen Zugriff auf die UI, kann also Layouts, Canvas, 3d und Animationen nutzen.

Manifest

Im Manifest muß nur der Service deklariert werden. Falls ein Settingsmenü benötigt wird muß die Klasse im Meta gesetzt werden gesetzt werden.

<service
    android:name=".VideoDreamService"
    android:exported="true"
    android:label="@string/my_daydream_name" >
    <intent-filter>
        <action android:name="android.service.dreams.DreamService" />
 
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
 
    <meta-data
        android:name="android.service.dream"
        android:resource="@xml/dream_info" />
</service>

Layout

Zum einfacheren Testen benutze ich ein ganz normales Layout mit einer VideoView .

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context=".MainActivity" >
 
    <VideoView
        android:id="@+id/videoView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />
 
</RelativeLayout>

Service

In meinem Beispiel wird ein Video ohne Ton in einer Endlosschleife abgespielt.

package de.schmitt.michael.daydream;
 
/******* imports ***********/
/** ...**/
 
public class VideoDreamService extends DreamService {
 
 
	public void onDreamingStarted() {
		super.onDreamingStarted();
 
		setContentView(R.layout.activity_main);
 
 
		VideoView vv = (VideoView)findViewById(R.id.videoView1);
		vv.setVideoURI(Uri.parse("android.resource://" + getPackageName() +"/"+R.raw.video));
 
		Log.i(TAG,  Environment.getExternalStorageDirectory().toString());
		Log.i(TAG,  getApplicationContext().getPackageName() );
		vv.setOnPreparedListener(new OnPreparedListener() {
		    @Override
		    public void onPrepared(MediaPlayer mp) {
		        mp.setLooping(true);
 
		    }
		});
 
		vv.setSoundEffectsEnabled(false);
 
		vv.start();
	}
	public void onDreamingStopped() {
		// Wird aufgerufen wenn der Service beendet wird. 
 
        }
 
}

Links

http://android-developers.blogspot.de/2012/12/daydream-interactive-screen-savers.html

Facebook SDK für Android einrichten

Quelle: Facebook Developers

 

  •  SDK runterladen 
  • Zip entpacken, alles nach Eclipse exportieren (ohne in den Workspace zu kopieren)
  •  Evtl. Project -> Clean ausführen
  • Developer Account anlegen
  • Key Hash mit dem keytool  (liegt in <JDK Folder>/bin) erzeugen
  • (Linux, Mac) keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
  • (Windows) keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64
  • Im Profil Key Hash unter Sample App Settings eintragen.

 

Beispiele Testen.

Skeleton für Webviews in Android

package de.schmitt.michael.webview;
 
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
 
@SuppressLint("SetJavaScriptEnabled")
public class ActivityMain extends Activity {
	protected WebView wv;
	private final static String URL="http://www.google.de/";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
 
		 WebView w = new WebView(this);
		 w.setWebViewClient(new WebViewClient());
		 w.getSettings().setJavaScriptEnabled(true);
		 w.loadUrl(URL);
		 setContentView(w);
 
 
	}
}

Mehr zum Thema in der Android Dokumentation

Google Cloud Messaging (GCM) Tutorial

In diesem Beitrag geht es darum wie man Nachrichten via GCM an Apps verschicken kann.

Viele Android Apps sind klassische Client/Server Anwendungen. Der Client tätigt Requests an einen Server und bekommt im besten Fall eine vernünftige Antwort. In anderer Richtung ist dies jedoch nicht so einfach. Wenn der Server Daten an 1 bis n Clients senden möchte ist das in diesem Szenario nicht so einfach. Mobiltelefone sind meist nicht über eine statische IP zu erreichen, es ist nicht sichergestellt, daß das Gerät mit dem Internet verbunden ist wenn eine Nachricht versendet wird. Wenn der Client regelmäßig den Server anpollt kostet das Bandbreite und elektische Leistung.

Continue reading

JDownloader vernünftig unter Ubuntu ausführen

Mit Java halte ich es wie mit Drogen: wo es nur geht mach ich einen Bogen drum. Java Programme gieren nach Ram, die Swing GUI sieht nicht gerade hübsch aus und beim Programmieren muß ich objektorientierte Orgien abfeiern. Das einzige Programm das ich regelmäßig nutze ist der JDownloader um mir ab und an Dateien bei One-Click-Filehostern herunterzuladen. Mir ist kein Programm bekannt, welches in Sachen Komfort und Bedienung mit den JDownloader auch nur annähernd gleichzieht.

Nun hab ich mir einen neuen Rechner zugelegt und entsprechend ein OS installiert werden. Leider habe ich den Fehler begangen die offene Implementierung der JRE zu installieren. Diese Laufzeitumgebung macht alles noch schlimmer. Die Reaktionszeiten des JDownloaders werden noch größer, ab und an friert die GUI komplett ein. Mir ist klar, daß das nicht alleine an der JRE liegen kann aber ich habe auch nicht wirklich Lust mir diese Probleme wegzubasteln.

Nach der Installation der JRE von Sun Oracle läuft es schon zügiger und stabiler.

apt-get install sun-java6-jre

Falls mehrere JRE’s auf Eurer Kiste laufen muß noch die „richtige“ Laufzeitumgebung ausgewählt werden:

update-alternatives –config java

 

Zusätzlich habe ich noch die Windowdecorations deaktiviert (Settings->User Interface)

 

Flickr Uploads unter Linux

Gerade ein nettes Java Tool für Flickr gefunden: jUploadr. Wie der Name schon sagt, handelt es sich dabei um eine Javaprogramm. Das Tool muß nur gestartet werden und der Zugriff über die Webapi genehmigt werden. Nun einfach per Drag n Drop Bilder einfügen, taggen und hochladen. Genial einfach 🙂