- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用地理编码来检索纬度、经度值的地址。我在扩展 IntentService 的单独类中实现此 GeoCoding。当我检索地址时,我想将它发送回原始的主要 Activity ,为此我使用 ResultReciever,并且实际上遵循 tutorial .
这是我用于 GeoCode 的类,即将 GPS 坐标传输到物理地址。在 onHandleIntent
deliverResultToReceiver
时出现错误
public class FetchAddressIntentService extends IntentService {
protected ResultReceiver mReceiver;
public FetchAddressIntentService() {
super("GPSGame");
}
@Override
protected void onHandleIntent(Intent intent) {
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
String errorMessage = "";
// Get the location passed to this service through an extra.
Location location = intent.getParcelableExtra(
Constants.LOCATION_DATA_EXTRA);
Log.e("LAT",Double.toString(location.getLatitude()));
Log.e("LONG",Double.toString(location.getLongitude()));
List<Address> addresses = null; /*** ADDRESS CAN BE OF ANOTHER LIBRARY ***/
try {
addresses = geocoder.getFromLocation(
location.getLatitude(),
location.getLongitude(),
// In this sample, get just a single address.
1);
} catch (IOException ioException) {
// Catch network or other I/O problems.
errorMessage = "service not available";
Log.e("exception", errorMessage);
} catch (IllegalArgumentException illegalArgumentException) {
// Catch invalid latitude or longitude values.
errorMessage = "IllegalArgumentException";
Log.e("Exception", errorMessage + ". " +
"Latitude = " + location.getLatitude() +
", Longitude = " +
location.getLongitude(), illegalArgumentException);
}
// Handle case where no address was found.
if (addresses == null || addresses.size() == 0) {
if (errorMessage == "") {
errorMessage = "no address found";
Log.e("address", errorMessage);
}
deliverResultToReceiver(Constants.FAILURE_RESULT, errorMessage);
}
else {
Address address = addresses.get(0);
ArrayList<String> addressFragments = new ArrayList<String>();
// Fetch the address lines using getAddressLine,
// join them, and send them to the thread.
for(int i = 0; i < address.getMaxAddressLineIndex(); i++) {
addressFragments.add(address.getAddressLine(i));
}
Log.i("address", "address found");
deliverResultToReceiver(Constants.SUCCESS_RESULT,
TextUtils.join(System.getProperty("line.separator"),
addressFragments)); TextUtils.join(System.getProperty("line.separator"),addressFragments));
}
}
private void deliverResultToReceiver(int resultCode, String message) {
Bundle bundle = new Bundle();
bundle.putString(Constants.RESULT_DATA_KEY, message);
mReceiver.send(resultCode, bundle);
}
}
这是我试图在其中获取地址的 MainAcitivty
类。请注意,还有一个私有(private)类 AddressResultReceiver
也扩展了 ResultReciever
。
public class MainActivity extends Activity implements
ConnectionCallbacks, OnConnectionFailedListener, LocationListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
latitudeText = (TextView) findViewById(R.id.latitudeText);
longitudeText = (TextView) findViewById(R.id.longitudeText);
lastUpdateTimeText = (TextView) findViewById(R.id.lastUpdateText);
buildGoogleApiClient();
}
protected void startIntentService() {
Intent intent = new Intent(this, FetchAddressIntentService.class);
intent.putExtra(Constants.RECEIVER, mResultReceiver);
intent.putExtra(Constants.LOCATION_DATA_EXTRA, mLastLocation);
startService(intent);
AddressResultReceiver ar = new AddressResultReceiver(null);
Bundle b = new Bundle();
ar.onReceiveResult(Constants.SUCCESS_RESULT, b);
}
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
}
@SuppressLint("NewApi")
@Override
public void onConnected(Bundle connectionHint) {
Toast.makeText(this, "onConnected", Toast.LENGTH_LONG).show();
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
mGoogleApiClient);
if (mLastLocation != null) {
String latitude = String.valueOf(mLastLocation.getLatitude());
String longitude = String.valueOf(mLastLocation.getLongitude());
latitudeText.setText("latitude: " + latitude);
longitudeText.setText("longitude: " + longitude);
}
if (mLastLocation != null) {
// Determine whether a Geocoder is available.
if (!Geocoder.isPresent()) {
Toast.makeText(this, "No geocoder available",
Toast.LENGTH_LONG).show();
return;
}
if (mAddressRequested) {
startIntentService();
}
}
}
private void updateUI() {
latitudeText.setText(String.valueOf(mCurrentLocation.getLatitude()));
longitudeText.setText(String.valueOf(mCurrentLocation.getLongitude()));
lastUpdateTimeText.setText(mLastUpdateTime);
}
class AddressResultReceiver extends ResultReceiver {
public AddressResultReceiver(Handler handler) {
super(handler);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
// Display the address string
// or an error message sent from the intent service.
String mAddressOutput = resultData.getString(Constants.RESULT_DATA_KEY);
Log.e("RESULT!!!", mAddressOutput);
// Show a toast message if an address was found.
if (resultCode == Constants.SUCCESS_RESULT) {
;
}
}
}
}
当我调用私有(private)方法 deliverResultToReciever
时,出现空指针异常。如果您能告诉我如何正确获取地址数据,我们将不胜感激
最佳答案
在传递给 Intent Service 之前不初始化 mResultReceiver
对象。按如下方式执行:
protected void startIntentService() {
Intent intent = new Intent(this, FetchAddressIntentService.class);
mResultReceiver = new AddressResultReceiver(new Handler());
.... your code here
}
并在FetchAddressIntentService
类中初始化mReceiver
对象,方法是在onHandleIntent
方法中获取接收者:
@Override
protected void onHandleIntent(Intent intent) {
mReceiver = intent.getParcelableExtra(Constants.RECEIVER);
//...your code here
}
关于android - ResultReceiver 给出 Nullpointer 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29215431/
我正在 Android 中实现 REST 客户端。我看到了一个示例,该示例使用 Service 执行与服务器的连接,并且 ResultReceiver 会收到操作完成通知。我正在从 fragment
我在包 A (SignerClient) 中有一个 Activity ,在包 B (MyService) 中有一个服务 Activity 的结果接收者: private ResultReceiver
在 intentservice 完成后,我无法将对象传回。我的目标是在发送通知后将 currentCharacter 对象发送回 Mainactivity。我用 onResult 尝试过,但 inte
我尝试绑定(bind)到自定义服务但没有成功。 我的定制服务 public class CustomService extends Service { private CustomReceiv
Activity 实例化 ResultReceiver 并覆盖 onReceiveResult。该 Activity 然后将 Intent 发送到 IntentService 并包含 ResultRe
看,我有以下代码: 我的行动: final Intent intent = new Intent(getApplicationContext(), MyService.class) .putExtra
我有一个使用 android.support.v4.os.ResultReceiver 传递数据的 IntentService。在 IntentService 中,当我使用 ResultReceive
我有一个服务类,我可以通过它向我的 Activity 发送一些数据 public class baseApi extends Service { @Override public int
我有一个在后台运行的服务,它从一个 Activity 开始,并且在没有 Activity 的情况下完成它的工作。使用 ResultReceiver,我可以与 Activity 进行通信,但只要 Act
我已经搜索过答案,但找不到。我在 IntentService 中对纬度和纬度进行反向地理编码,然后当我尝试 ResultReceiver.send 时它会抛出 nullpointerexception
我正在使用地理编码来检索纬度、经度值的地址。我在扩展 IntentService 的单独类中实现此 GeoCoding。当我检索地址时,我想将它发送回原始的主要 Activity ,为此我使用 Res
ResultReceiver 在哪个新的 AndroidX 依赖中? 我已经尝试过 androidx.legacy:legacy-support-v4:1.0.0-alpha1,假设它可能在 v4 下
基本上,我想从 IntentService 建立对 Activity 的回调。我的问题与此处回答的问题非常相似: Restful API service 但是,在应答代码中, Activity 代码被
我有一些代码: inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0, new Result
因此,我正在尝试设置一个 Intent 服务以从 Internet 下载数据,并且我希望该服务将结果对象发送到 Activity (或通知 Activity 下载过程已完成)。但我不知道使用这些方法/
这个问题已经有人问过here但还没有好的答案。 所以基本上我有一个在后台运行的 Intent 服务来做一些事情,完成后我使用 resultreceiver 将结果发送回 Activity ,所以我需要
我正在重构一个应用程序以使用 androidx。我一直在努力摆脱所有不支持它的库。我以为我已经删除了所有使用支持库的库,但看起来仍然有一些东西正在导入它。我现在得到错误: AGPBI: {"kind"
我正在使用 ionic 构建应用程序我已经添加了 firebase 云消息,一切正常但是今天,当我构建时显示错误。 ionic cordova 平台 rm android 删除插件 清除缓存 删除 p
我通过网络搜索找到了这个答案。但是没有找到结果。抱歉,我是 Java 和 Android 编程的新手。 我会详细说明我的问题。假设我的 Activity 启动了一个 IntentService 并且它
也许我找不到答案的原因是我做题的方式不对,但我仍然希望有人能回答这个问题。 我有一个带有 ListView 的 MainActivity,它在处理后从数据库中显示一些值: public class M
我是一名优秀的程序员,十分优秀!