したがって、この問題は古く、回答済みであることはわかっていますが、コメントに記載されているのと同じ問題がありました。Preference から派生したクラスから ACTION_GET_CONTENT インテントを起動しようとすると、この問題が発生しました。Pentium10 の提案を使用して、Activity から派生した新しいクラスを作成し、インテントを起動して結果を取得しました。このクラスを SurrogateActivity と呼ぶと、次のようになります。
public class SurrogateActivity extends Activity {
@Override
public void onCreate(Bundle savedInstance){
super.onCreate(savedInstance);
Intent chooseFileIntent = new Intent();
chooseFileIntent.setAction(Intent.ACTION_GET_CONTENT);
// In my case I need an audio file path
chooseFileIntent.setType("audio/*");
startActivityForResult(chooseFileIntent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK){
Uri audioPath = data.getData();
// Use SharedPreferences.Editor to update preference value
SharedPreferences.Editor prefsEditor = PreferenceManager.getDefaultSharedPreferences(this).edit();
prefsEditor.putString(Keys.PREF_ALERT, audioPath.toString());
prefsEditor.commit();
}
// finish this "hidden" activity on any result
finish();
}
}
私のカスタム Preference クラスでは、使用者が設定をタップしたときにピッカーを起動したいと考えていました。onClick() を設定して SurrogateActivity クラスを起動し、onCreate メソッドで本当に必要なインテントを起動します。
@Override
protected void onClick(){
super.onClick();
Intent launchHiddenActivity = new Intent(getContext(), SurrogateActivity.class);
getContext().startActivity(launchHiddenActivity);
}
Pentium10 は Preference クラス内にプライベート クラスを提案しましたが、これを試したところ、Android はそれをインスタンス化できませんでした。また、「代理アクティビティ」をマニフェストに追加することを忘れないでください。