Widget pour activer/désactiver la caméra lampe de poche sous android
Je suis en train d'élaborer un widget pour activer/désactiver la caméra led de téléphone.
J'ai fait un widget qui peut fonctionner comme le bouton à bascule (on/off).
Comportement est comme suit : Parfois, le voyant reste allumé quand je activer le widget.
Mais elle n'est pas allumer/éteindre la caméra led mais il change l'icône.
Je ne suis pas en mesure de comprendre quel est le problème réel.
La même chose fonctionne bien en Activité (lampe de poche à la Demande).
Quelqu'un peut-il svp m'expliquer comment puis-je résoudre mon problème ?
Où je vais mal ?
Vous pouvez regarder le code ci-dessous que j'ai fait jusqu'à présent
onUpdate
méthode
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
//super.onUpdate(context, appWidgetManager, appWidgetIds);
remoteViews = new RemoteViews( context.getPackageName(), R.layout.widgetlayout);
watchWidget = new ComponentName( context, FlashLightWidget.class );
Intent intentClick = new Intent(context,FlashLightWidget.class);
intentClick.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, ""+appWidgetIds[0]);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetIds[0],intentClick, 0);
remoteViews.setOnClickPendingIntent(R.id.myToggleWidget, pendingIntent);
appWidgetManager.updateAppWidget( watchWidget, remoteViews );
ctx=context;
}
onReceive
méthode est comme suit :
@Override
public void onReceive(Context context, Intent intent) {
//TODO Auto-generated method stub
remoteViews = new RemoteViews( context.getPackageName(), R.layout.widgetlayout);
if (intent.getAction()==null) {
Bundle extras = intent.getExtras();
if(extras!=null) {
if(status)
{
status=false;
remoteViews.setImageViewResource(R.id.myToggleWidget, R.drawable.shutdown1);
processOnClick();
Toast.makeText(context,"Status==false-onclick",Toast.LENGTH_SHORT).show();
}
else
{
status = true;
remoteViews.setImageViewResource(R.id.myToggleWidget, R.drawable.shutdown2);
processOffClick();
Toast.makeText(context,"Status==true--Ofclick",Toast.LENGTH_SHORT).show();
}
}
watchWidget = new ComponentName( context, FlashLightWidget.class );
(AppWidgetManager.getInstance(context)).updateAppWidget( watchWidget, remoteViews );
}
}
}
processOffClick
méthode
private void processOffClick() {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.setPreviewCallback(null);
mCamera.release();
mCamera = null;
}
}
processOnClick
méthode
private void processOnClick() {
if(mCamera==null)
{
try {
mCamera = Camera.open();
} catch (Exception e) {
e.printStackTrace();
}
}
if (mCamera != null) {
Parameters params = mCamera.getParameters();
List<String> flashModes = params.getSupportedFlashModes();
if (flashModes == null) {
return;
} else {
params.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
mCamera.startPreview();
String flashMode = params.getFlashMode();
if (!Parameters.FLASH_MODE_TORCH.equals(flashMode)) {
if (flashModes.contains(Parameters.FLASH_MODE_TORCH)) {
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(params);
}
}
}
} else if (mCamera == null) {
//Toast.makeText(ctx, "Camera not found", Toast.LENGTH_LONG).show();
return;
}
}
- Veuillez vous reporter à cet article pour une solution valide: stackoverflow.com/questions/3878294/...
- Cela ne m'aide copain.. j'ai désigné plusieurs fois avant.. Ce que je demande est totalement différent.
- Si je lis ce que vous faites correctement... vous semblez être d'essayer de contrôler la led à partir de l'app widget fournisseur, Est-ce correct? Si donc vous avez besoin pour tirer ce code et de le mettre dans sa propre classe et appeler cette classe à partir de votre app widget fournisseur
- Oui, vous avez raison. Je suis en train de contrôle de la led à partir de l'app widget fournisseur. Mais je pense que je suis la mise en œuvre de mauvaises choses dans AppWidgetProvider. Manipulation sur les événements dans onReceive méthode n'est pas bonne je pense !
- Qui est correct. Le AppWidgetProvider est très limité dans ce qu'il peut faire. Vous accédez à la disposition des widgets via RemoteViews developer.android.com/reference/android/widget/RemoteViews.html donc ma recommandation de créer une catégorie distincte pour gérer tous les AppWidget de l'INTERFACE utilisateur des mises à jour... voici un exemple simple que j'ai posté aujourd'hui: stackoverflow.com/questions/7560265/...
- Downvoted pour ?
Vous devez vous connecter pour publier un commentaire.
Après un long moment, je suis libre pour résoudre ce problème.
Voici ce que j'ai fait.
FlashlightWidgetProvider
classe :et BroadcastReceiver pour FlashlightWidgetReceiver :
Autorisation
Manifest.xml
fichier :Également enregistrer les récepteurs de la
Manifest.xml
fichier :Remarque importante : Ce code fonctionne parfaitement si votre téléphone a
FLASH_MODE_TORCH
pris en charge.Je l'ai testé dans Samsung Galaxy Ace 2.2.1 & 2.3.3. Le code ne fonctionne pas parce que l'appareil n'a aucune FLASH_MODE_TORCH.
Fonctionne très bien dans HTC Salsa, feu de forêt..
Si quelqu'un peut tester et de publier les résultats ici, ce serait mieux.
String x = params.getFlashMode();
... Si x esttorch
puis c'eston
si x estoff
puis c'estoff
.La meilleur technique de traitement des clics à partir d'un
RemoteViews
est de créer unPendingIntent
que les appels de service et d'exécuter les "trucs" que vous voulez dans le service, y compris tout supplément deRemoteViews
mises à jour pour votre widget. Vous pouvez envoyer les données pertinentes à l'intention des extras. Les appels de servicestopSelf()
à la fin, de sorte qu'il s'arrête.Vous ne pouvez pas maintenir un état dans un
BroadcastReceiver
; le système d'exécution de ces sur le fil, et de ne pas maintenir toute référence à votre instance après l'appel deonReceive()
. VotremCamera
variable n'est pas assuré d'être maintenu entre les appels de votreBroadcastReceiver
.Si vous avez vraiment besoin de maintenir un état, vous devez le faire dans le service, et n'utilisez pas
stopSelf()
(jusqu'à une heure appropriée).Vous n'avez pas besoin d'un thread d'INTERFACE utilisateur à utiliser le
Camera
classe, sauf si vous faites de prévisualisation de l'image, ce qui nécessite uneSurfaceHolder
(et implique une interface utilisateur (IU). Vous devez, cependant, ont une boucle active, ouCamera
de ne pas poster des rappels pour vous, ce qui est un problème puisqueCamera
est essentiellement asynchrone. Vous pouvez le faire au sein d'un service (voirHandlerThread
) et de garder votre service en cours d'exécution jusqu'à ce qu'il est temps derelease()
tout. Selon ce thread appelleCamera.open()
recevrez des rappels.A tout le monde en fait de lire la section sur l'App Widgets?
http://developer.android.com/guide/topics/appwidgets/index.html
À l'aide de la AppWidgetProvider Classe l'article dit à peu près ce que je dis ici.
J'ai eu une situation similaire, où j'ai besoin pour l'exécution de certaines android code sur le thread d'INTERFACE utilisateur ... ce qui n'est disponible que dans une Activité. Ma solution - une activité complètement transparente de mise en page. Donc, vous venez de voir votre écran d'accueil (mais ne répond pas) pendant que vous effectuez vos actions, qui dans votre cas devrait être assez rapide.
J'ai une solution qui n'est pas grand, mais fonctionne. Ont le widget de l'appel d'une Activité, et l'Activité d'activer le flash, et plus tard, près de l'Activité. De même pour l'éteindre. Si cela fonctionne, dans l'Activité, alors cette solution fonctionne. Ce n'est pas élégant, mais fonctionne. Je l'ai essayé.