在一天中的特定时间拍照

时间:2013-11-02 08:36:07

标签: android service camera broadcastreceiver

我的应用程序应该在一天的特定时间在后台拍照。我将使用AlarmManager,但我想知道实现我的应用程序行为(即拍照)的类是否应该扩展Service或BroadcastReceiver。你觉得怎么样?

1 个答案:

答案 0 :(得分:1)

您应该将IntentSerivce与AlaramManger一起使用,并在您的活动中定义BroadcastReceiver。

public class DownloadService extends IntentService {

private int result = Activity.RESULT_CANCELED;
 public static final String URL = "urlpath";
public static final String FILENAME = "filename";
public static final String FILEPATH = "filepath";
public static final String RESULT = "result";
public static final String NOTIFICATION = "com.vogella.android.service.receiver";

public DownloadService() {
 super("DownloadService");
}

// Will be called asynchronously be Android
@Override
protected void onHandleIntent(Intent intent) {
String urlPath = intent.getStringExtra(URL);
String fileName = intent.getStringExtra(FILENAME);
File output = new File(Environment.getExternalStorageDirectory(),
    fileName);
if (output.exists()) {
  output.delete();
}

InputStream stream = null;
FileOutputStream fos = null;
try {

URL url = new URL(urlPath);
stream = url.openConnection().getInputStream();
InputStreamReader reader = new InputStreamReader(stream);
  fos = new FileOutputStream(output.getPath());
  int next = -1;
  while ((next = reader.read()) != -1) {
    fos.write(next);
  }
  // Successful finished
  result = Activity.RESULT_OK;

} catch (Exception e) {
  e.printStackTrace();
} finally {
  if (stream != null) {
    try {
      stream.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  if (fos != null) {
    try {
      fos.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
publishResults(output.getAbsolutePath(), result);
}

private void publishResults(String outputPath, int result) {
Intent intent = new Intent(NOTIFICATION);
intent.putExtra(FILEPATH, outputPath);
intent.putExtra(RESULT, result);
sendBroadcast(intent);
}
} 


public class MainActivity extends Activity {

private TextView textView;
private BroadcastReceiver receiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
  Bundle bundle = intent.getExtras();
  if (bundle != null) {
    String string = bundle.getString(DownloadService.FILEPATH);
    int resultCode = bundle.getInt(DownloadService.RESULT);
    if (resultCode == RESULT_OK) {
      Toast.makeText(MainActivity.this,
          "Download complete. Download URI: " + string,
          Toast.LENGTH_LONG).show();
      textView.setText("Download done");
    } else {
      Toast.makeText(MainActivity.this, "Download failed",
          Toast.LENGTH_LONG).show();
      textView.setText("Download failed");
    }
  }
}

};

@Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 textView = (TextView) findViewById(R.id.status);


 }

 @Override
 protected void onResume() {
super.onResume();
 registerReceiver(receiver, new IntentFilter(DownloadService.NOTIFICATION));
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver);
}

public void onClick(View view) {

Intent intent = new Intent(this, DownloadService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);

AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
//   Start every 30 seconds
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent);
}
}