我正在尝试在已启动的服务中使用AWS Android SDK for S3.我对SDK和服务都不熟悉.我非常有信心Transfer Utility也在运行服务.
Handler (android.os.Handler) {11629d87} sending message to a Handler on a dead thread java.lang.IllegalStateException: Handler (android.os.Handler) {11629d87} sending message to a Handler on a dead thread at android.os.MessageQueue.enqueueMessage(MessageQueue.java:325) at android.os.Handler.enqueueMessage(Handler.java:631) at android.os.Handler.sendMessageAtTime(Handler.java:600) at android.os.Handler.sendMessageDelayed(Handler.java:570) at sksDoneLater(TransferService.java:189) at com.amazonaws.mobileconnectors.s3.transferutility.TransferService.access$200(TransferService.java:44) at com.amazonaws.mobileconnectors.s3.transferutility.TransferService$2.handleMessage(TransferService.java:166) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:135) at android.os.HandlerThread.run(HandlerThread.java:61)
这是我用来启动它的代码:
AmazonS3 amazonS3 = new AmazonS3Client(credentialsProvider); mTransferUtility = new TransferUtility(amazonS3, getApplicationContext()); TransferObserver observer = mTransferUtility.upload( S3_RAW_BUCKET_ARN, mVidFileKey, mVidFile); observer.setTransferListener(new TransferListener() {...})
之前它说它无法获得s3客户端.我在上面的应用程序类中创建了客户端,并成功地在一个活动中使用相同的代码来执行成功的传输,因此它必须是我不知道的服务的显而易见的东西.上面的代码在从onStartCommand()
服务中调用的方法中调用.
任何帮助将非常感激.
更新 - 请求全班并在此处显示:
public class VideoCompressionService extends Service {; private Bus bus; private TransferUtility mTransferUtility; private int mVidWidth; private int mVidHeight; private File mCompressedVidFile; private File mVidFile; private String mVidFileKey; private NotificationManager mNotificationManager; private android.support.v4.app.NotificationCompat.Builder mNotification; public VideoCompressionService() { } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent != null) { String realPath = MediaUtils.getRealVideoPathFromURI(this.getContentResolver(), intent.getData()); if (realPath != null) { this.mVidFile = new File(realPath); this.mVidFileKey = intent.getStringExtra(EXTRA_VID_FILE_KEY); this.mVidWidth = intent.getIntExtra(EXTRA_VID_WIDTH, 0); this.mVidHeight = intent.getIntExtra(EXTRA_VID_HEIGHT, 0); this.bus = CoPhotoApplication.getVideoCompressionBus(); if (mVidFile != null && mVidFile.exists() && mVidFile.canRead()) { mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); mNotification = new NotificationCompat.Builder(this) .setContentTitle("Compressing Video - Step 1 of 3") .setContentText("Uploading video for processing...") .setSmallIcon(R.drawable.ic_launcher); if (mVidWidth == 0 || mVidHeight == 0) { MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource(mVidFile.getAbsolutePath()); mVidWidth = Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)); mVidHeight = Integer.parseInt(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)); mmr.release(); } uploadVidToS3(); } return Service.START_NOT_STICKY; } else { VideoCompressionService.this.stopSelf(); return Service.START_NOT_STICKY; } } else { VideoCompressionService.this.stopSelf(); return Service.START_NOT_STICKY; } } @Nullable @Override public IBinder onBind(Intent intent) { return null; } private void uploadVidToS3() { compressionUploadStarted(); CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider( getApplicationContext(), "*********ID HERE********", // Identity Pool ID Regions.US_EAST_1 // Region ); AmazonS3 amazonS3 = new AmazonS3Client(credentialsProvider); mTransferUtility = new TransferUtility(amazonS3, getApplicationContext()); TransferObserver observer = mTransferUtility.upload( S3_RAW_BUCKET_ARN, mVidFileKey, mVidFile); observer.setTransferListener(new TransferListener() { @Override public void onStateChanged(int id, TransferState state) { if (state == TransferState.COMPLETED) { compressionUploadFinished(true); zencodeVideo(mVidFileKey); } else if (state == TransferState.FAILED) { compressionUploadFinished(false); } } @Override public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) { int progress = Math.round(100 * ((float) bytesCurrent / bytesTotal)); String progressPercentage = String.valueOf(progress) + "%"; compressionUploadProgress(progress, progressPercentage); } @Override public void onError(int id, Exception ex) { compressionUploadFinished(false); } }); } private void compressionUploadStarted() { bus.post(new CompressionUploadStartedEvent()); updateNotification(); } private void compressionUploadProgress(int progress, String progressPercentage) { bus.post(new CompressionUploadProgressEvent(progress, progressPercentage)); mNotification.setProgress(100, progress, false); updateNotification(); } private void compressionUploadFinished(boolean successfully) { bus.post(new CompressionUploadFinishedEvent(successfully)); if (successfully) { mNotification.setContentText("Upload complete"); } else { mNotification.setContentTitle("Compression Failed"); mNotification.setContentText("Upload failed. Please try again later."); } updateNotification(); if (!successfully) { VideoCompressionService.this.stopSelf(); } } private void updateNotification() { mNotificationManager.notify(NOTIFICATION_ID, mNotification.build()); }
Vinicius Lim.. 8
我发现自己处于同一个问题......这就是为我解决的问题:
我注意到我在Manifest中注册的SyncAdapter有以下服务:
android:process =":sync"告诉服务在一个名为:sync的私有进程中运行所以我只是告诉Amazon SDK的TransferService在同一个线程中运行.
在那之后,我没有得到错误TransferService无法获得s3客户端,它将停止,最后能够将我的图片上传到S3
我发现自己处于同一个问题......这就是为我解决的问题:
我注意到我在Manifest中注册的SyncAdapter有以下服务:
android:process =":sync"告诉服务在一个名为:sync的私有进程中运行所以我只是告诉Amazon SDK的TransferService在同一个线程中运行.
在那之后,我没有得到错误TransferService无法获得s3客户端,它将停止,最后能够将我的图片上传到S3