0

Facebookのアルバムに写真をアップロードするアプリを開発中です。アプリは問題なく写真をアップロードします。ハードコーディングすれば、写真にキャプションを付けることもできます。私がやろうとしているのは、ユーザーのキャプションをキャプチャし、画像をアップロードする前にそれをバンドルに配置するアラート ダイアログを作成することです。起こっていることは、写真がアップロードされた後、ダイアログボックスにキャプションを入力することです。

アラートダイアログをポップする方法は次のとおりです...

public String createAlert() {      
        AlertDialog.Builder alert = new AlertDialog.Builder(this);                 
          alert.setTitle("Enter Caption for Photo");  
          alert.setMessage("Caption :");
          final EditText input = new EditText(this); 
          alert.setView(input);

          alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {  
                public void onClick(DialogInterface dialog, int whichButton) {  
                    imageCaption = input.getText().toString();
                    return;                  
                   }  
                 });  

                alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                        return;   
                    }
                });
               AlertDialog helpDialog = alert.create();
               helpDialog.show();
               return imageCaption;

  }

今ここにバンドルとFacebookへのアップロードがあります...

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);        
        switch (requestCode) {
        case PICK_EXISTING_PHOTO_RESULT_CODE: {   

        if (resultCode == RESULT_OK){
              Uri photoUri = data.getData();
              String imagePath = getPath(photoUri);
              byte[] data1 = null;


                Bitmap bi = BitmapFactory.decodeFile(imagePath);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bi.compress(Bitmap.CompressFormat.JPEG, 100, baos);
                data1 = baos.toByteArray();

                Bundle params = new Bundle();
                params.putString(Facebook.TOKEN, facebook.getAccessToken());
                params.putString("caption", createAlert() );
                params.putByteArray("photo", data1);

                try {
                    facebook.request("me/photos",params,"POST");
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } 
              }


        break;
        }
        default: {
        facebook.authorizeCallback(requestCode, resultCode, data);
        break;
        }


    }

    }
4

1 に答える 1

0

createAlert メソッドが終了した時点では、ユーザーは何も入力していません。ダイアログを表示するイベントが、コードの実行が停止した後に処理されるシステム メッセージに追加されました。次に、コードは Facebook の投稿を作成します。するとダイアログが表示されます。次に、正しいものがクリックされると、OnClickListener のコードが実行されます。

ダイアログ アクションが発生した後、Facebook の投稿を送信する必要があります。これを行う簡単な方法は、今呼び出している行のすぐ上に createAlert メソッドをインライン化することだと思います。次に、残りの Facebook コードを onClick に貼り付けます。これにより、適切な順序が得られ、再びメソッドに分割できます。

show を呼び出してもすぐには何も実行されず、onclick のコードもすぐには実行されないことに注意してください。これは、イベントをキューに入れ、別のイベントが発生したときに何が起こるかをそれぞれ指定するだけです。これは、多くの GUI API と同様に、イベント ベースのプログラミングです。

編集: コードを編集して、機能させる方法を示します。ただし、コンパイルするのに十分な量を投稿していないため、クリーンアップが必要になる場合があります。ここ:

protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case PICK_EXISTING_PHOTO_RESULT_CODE:

            if ( RESULT_OK == resultCode) {
                final Uri photoUri = data.getData();
                createAlert(photoUri);
            }

            break;
        default:
            facebook.authorizeCallback(requestCode, resultCode, data);
            break;
    }
}

public void createAlert(final Uri photoUri) {
    final AlertDialog.Builder alert = new AlertDialog.Builder(this);
    alert.setTitle("Enter Caption for Photo");
    alert.setMessage("Caption :");

    final EditText input = new EditText(this);
    alert.setView(input);

    alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(final DialogInterface dialog, final int whichButton) {
            final String caption = input.getText().toString();
            postToFacebook(photoUri, caption);
        }
    });

    alert.setNegativeButton("Cancel", null);
    final AlertDialog helpDialog = alert.create();
    helpDialog.show();
}

private void postToFacebook(final Uri photoUri, final String caption) {
    final String imagePath = getPath(photoUri);
    final byte[] data1 = null;

    Bitmap bi = BitmapFactory.decodeFile(imagePath);
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bi.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    data1 = baos.toByteArray();
    bi.recycle();
    bi = null;

    final Bundle params = new Bundle();
    params.putString(Facebook.TOKEN, facebook.getAccessToken());
    params.putString("caption", caption);
    params.putByteArray("photo", data1);

    try {
        facebook.request("me/photos", params, "POST");
    } catch (final FileNotFoundException e) {
        e.printStackTrace();
    } catch (final MalformedURLException e) {
        e.printStackTrace();
    } catch (final IOException e) {
        e.printStackTrace();
    }
}
于 2012-06-26T23:39:14.147 に答える